7.4. 创建并配置 OCSP 实例(RootCA)


这部分论述了针对 RootCA 安装和配置 OCSP 实例。
OCSP 系统证书将由 RootCA 发布,OCSP 将加入 RootCA 安全域。
在本例中,rootCA 的 OCSP 安装在 rhcs10.example.com 上,其内部目录服务器位于 rhds11.example.com 上。

注意

这是可选的。通常,不建议执行日常证书颁发的根 CA。因此,不需要 root CA 的 OCSP。在我们的示例中,仅针对演示目的提供了 RootCA 的 OCSP。

注意

确保文件 /opt/pki_rsa/ca-chain.pem 包含完整的 CA 证书链(此时,只有 RootCA 证书):

# ls -l /opt/pki_rsa/ca-chain.pem

# cat /opt/pki_rsa/ca-chain.pem
Copy to Clipboard Toggle word wrap

7.4.1. 替换临时 DS 证书(OCSP-rootca)

在为 RootCA 安装 OCSP 之前,我们为 OCSP 的目录服务器发出官方 SSL 服务器证书来替换临时 bootstrap。为此,我们首先要为目录服务器证书创建一个证书签名请求(CSR),然后将此请求提交到 CA。

注意

确保您使用 DS 服务器的 FQDN,如 cn=rhds11.example.com / host=rhds11.example.com

为真实 DS 证书生成 CSR

rhds11.example.com 上,为真实 DS 证书生成 PKCS10 证书签名请求:

  1. 停止 DS :

    # dsctl slapd-CC-RSA-OCSP-rootca-LDAP stop
    Copy to Clipboard Toggle word wrap
    注意

    如果您不了解 DS 实例的名称,请使用: dsctl -l 列出所有实例。

  2. 使用 certutil 工具生成 CSR:

    # certutil -R -d /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP -s "CN=rhds11.example.com" -g 2048 -f /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/pwdfile.txt -a -o /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/Server-Cert-ocsp-rootca.csr -z /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/noise.txt
    Copy to Clipboard Toggle word wrap
    重要

    编辑上面获取的 Server-Cert-ocsp-rootca.csr 输出文件,以在"Begin Certificate Request"之前删除几行。例如:

    # vi /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/Server-Cert-ocsp-rootca.csr
    Copy to Clipboard Toggle word wrap

    CSR 文件必须以"-----BEGIN CERTIFICATE REQUEST-----"行开头,并以"-----END CERTIFICATE REQUEST-----"行结尾。

  3. 远程将 Server-Cert-ocsp-rootca.csr 文件复制到 CA 所在的系统中。例如:

    # scp /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/Server-Cert-ocsp-rootca.csr root@rhcs10.example.com:/root/.dogtag/pki_rsa_bootstrap/certs_db/Server-Cert-ocsp-rootca.csr
    Copy to Clipboard Toggle word wrap

发出真实 DS 证书

rhcs10.example.com 上,发布实际的 SSL 服务器证书:

  1. 生成 CMC 请求:

    1. 创建 CMCRequest 配置文件。例如:

      # vim /root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.dirsrv-ocsp-rootca_pkcs10.cfg
      Copy to Clipboard Toggle word wrap
      ### numRequests: Total number of PKCS10 requests or CRMF requests.
      numRequests=1
      
      ### input: full path for the PKCS10 request or CRMF request,
      ### The content must be in Base-64 encoded format.
      ### Multiple files are supported. They must be separated by a space.
      ### For input on a different host, specify where to find the CSR.
      input=/root/.dogtag/pki_rsa_bootstrap/certs_db/Server-Cert-ocsp-rootca.csr
      
      ### output: full path for the CMC request in binary format
      ### For output on a different host, specify the destination.
      output=/root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.dirsrv-ocsp-rootca_pkcs10.req
      
      ### tokenname: name of the token where the agent signing cert can be found (default is internal)
      tokenname=internal
      
      ### nickname: nickname for the agent certificate that will be used to sign the CMC full request.
      nickname=PKI Bootstrap Administrator for RSA-RootCA
      
      ### dbdir: directory for cert8.db, key3.db and secmod.db
      dbdir=/root/.dogtag/pki_rsa_bootstrap/certs_db
      
      ### password: password for cert8.db that stores the agent certificate
      password=SECret.123
      
      ### format: request format, either pkcs10 or crmf
      format=pkcs10
      Copy to Clipboard Toggle word wrap
    2. 使用 CMCRequest 命令生成请求:

      # CMCRequest /root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.dirsrv-ocsp-rootca_pkcs10.cfg
      
      cert/key prefix =
      path = /root/.dogtag/pki_rsa_bootstrap/certs_db
      CryptoManger initialized
      token internal logged in...
      got signerCert: PKI Bootstrap Administrator for RSA-RootCA
      createPKIData: begins
      k=0
      createPKIData:  format: pkcs10
      useSharedSecret is false...
      signData: begins:
      getPrivateKey: got signing cert
      signData:  got signer privKey
      createSignedData: begins
      getSigningAlgFromPrivate: begins.
      getSigningAlgFromPrivate: found signingKeyType=RSA
      getSigningAlgFromPrivate: using SignatureAlgorithm: RSASignatureWithSHA256Digest
      createSignedData: digest created for pkidata
      createSignedData: digest algorithm =RSASignatureWithSHA256Digest
      createSignedData: building cert chain
      signData: signed request generated.
      getCMCBlob: begins
      getCMCBlob: generating signed data
      
      The CMC enrollment request in base-64 encoded format:
      
      . . . Output omitted . . .
      
      The CMC enrollment request in binary format is stored in
      /root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.dirsrv-ocsp-rootca_pkcs10.req
      Copy to Clipboard Toggle word wrap
  2. 提交 CMC 请求:

    1. 创建 HttpClient 配置文件。例如:

      # vim /root/.dogtag/pki_rsa_bootstrap/certs_db/HttpClient_dirsrv-ocsp-rootca.cfg
      Copy to Clipboard Toggle word wrap
      ### host: host name for the http server
      host=rhcs10.example.com
      
      ### port: port number
      port=8443
      
      ### secure: true for secure connection, false for nonsecure connection
      secure=true
      
      ### input: full path for the enrollment request, the content must be in binary format
      input=/root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.dirsrv-ocsp-rootca_pkcs10.req
      
      ### output: full path for the response in binary format
      output=/root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.dirsrv-ocsp-rootca_pkcs10.resp
      
      ### tokenname: name of the token where the SSL client authentication cert can be found (default is internal)
      ### This parameter will be ignored if secure=false
      tokenname=internal
      
      ### dbdir: directory for cert8.db, key3.db and secmod.db
      ### This parameter will be ignored if secure=false
      dbdir=/root/.dogtag/pki_rsa_bootstrap/certs_db
      
      ### clientmode: true for client authentication, false for no client authentication
      ### This parameter will be ignored if secure=false
      clientmode=true
      
      ### password: password for cert8.db
      ### This parameter will be ignored if secure=false and clientauth=false
      password=SECret.123
      
      ### nickname: nickname for client certificate
      ### This parameter will be ignored if clientmode=false
      nickname=PKI Bootstrap Administrator for RSA-RootCA
      
      ### servlet: servlet name
      servlet=/ca/ee/ca/profileSubmitCMCFull?profileId=caCMCserverCert
      Copy to Clipboard Toggle word wrap
    2. 使用 HttpClient 命令提交请求:

      # HttpClient /root/.dogtag/pki_rsa_bootstrap/certs_db/HttpClient_dirsrv-ocsp-rootca.cfg
      
      Total number of bytes read = 3096
      after SSLSocket created, thread token is NSS FIPS 140-2 User Private Key
      client cert is not null
      handshake happened
      writing to socket
      
      ##Response Headers begin##
      HTTP/1.1 200
      Content-Type: application/pkcs7-mime
      Content-Length: 2492
      Date: Tue, 29 Sep 2020 15:20:21 GMT
      Connection: close
      ##end##
      
      . . . Output omitted . . .
      
      The response in binary format is stored in
      /root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.dirsrv-ocsp-rootca_pkcs10.resp
      Copy to Clipboard Toggle word wrap
  3. 处理 CMC 响应:

    1. 使用 CMCResponse 处理响应,以 PEM 格式单独以链的形式显示所有证书:

      重要

      使用 "-v" 选项运行 CMCResponse 将链中每个证书的 PEM 返回为 Cert:0, Cert:1 等。在所有 PEM 下,输出也会以用户打印格式显示链中的每个证书。由于证书没有以固定顺序显示,因此为了确定其在链中的位置,您必须检查每个 "Certificate" 下的"Subject: "。对应的 PEM 显示在上面的同一位置。

      # CMCResponse -d /root/.dogtag/pki_rsa_bootstrap/certs_db -i /root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.dirsrv-ocsp-rootca_pkcs10.resp -v
      
      Cert:0
      ...
      ===
      Cert:1
      ...
      ===
      Cert:2
      ...
      ===
      Certificates:
      
        Certificate:
            Data:
                Version:  v3
                Serial Number: 0xA383694
                Signature Algorithm: SHA256withRSA - 1.2.840.113549.1.1.11
                Issuer: CN=CA Signing Certificate,OU=rhcs10-RSA-OCSP-rootca,O=Example-rhcs10-RSA-OCSP-rootca
                Validity:
                    Not Before: Tuesday, April 5, 2022 8:41:36 AM EDT America/New_York
                    Not  After: Monday, March 25, 2024 8:41:36 AM EDT America/New_York
                Subject: CN=rhds11.example.com
      
      . . . Output omitted . . .
      
          Certificate:
              Data:
                  Version:  v3
                  Serial Number: 0x5C8FAD4
                  Signature Algorithm: SHA256withRSA - 1.2.840.113549.1.1.11
                  Issuer: CN=CA Signing Certificate,OU=rhcs10-RSA-RootCA,O=Example-rhcs10-RSA-RootCA
                  Validity:
                      Not Before: Tuesday, April 5, 2022 8:36:21 AM EDT America/New_York
                      Not  After: Saturday, April 5, 2042 8:36:21 AM EDT America/New_York
                  Subject: CN=CA Signing Certificate,OU=rhcs10-RSA-RootCA,O=Example-rhcs10-RSA-RootCA
      
      . . . Output omitted . . .
      
          Certificate:
              Data:
                  Version:  v3
                  Serial Number: 0x80296C3
                  Signature Algorithm: SHA256withRSA - 1.2.840.113549.1.1.11
                  Issuer: CN=CA Signing Certificate,OU=rhcs10-RSA-RootCA,O=Example-rhcs10-RSA-OCSP-rootca
                  Validity:
                      Not Before: Tuesday, April 5, 2022 8:39:43 AM EDT America/New_York
                      Not  After: Friday, April 5, 2041 8:39:43 AM EDT America/New_York
                  Subject: CN=CA Signing Certificate,OU=rhcs10-RSA-OCSP-rootca,O=Example-rhcs10-RSA-RootCA
      
      . . . Output omitted . . .
      
      Number of controls is 1
      Control #0: CMCStatusInfoV2
      OID: {1 3 6 1 5 5 7 7 25}
      BodyList: 1
      Status: SUCCESS
      CMC Full Response.
      Copy to Clipboard Toggle word wrap
    2. 将新 Server-Cert DS 证书保存到 bootstrap 证书目录(例如 /root/.dogtag/pki_rsa_bootstrap/certs_db/)中的文件中。.pem 文件必须以 header -----BEGIN CERTIFICATE----- 开头,并以 footer -----END CERTIFICATE----- 结束。例如:

      # vi /root/.dogtag/pki_rsa_bootstrap/certs_db/Server-Cert-ocsp-rootca.pem
      Copy to Clipboard Toggle word wrap

      其中 Server-Cert-ocsp-rootca.pem 是 Directory Server 实例的新的 Server-Cert 证书,充当 RootCA 的 OCSP 的 internaldb。

      注意

      RootCA 的签名证书应与以下命令的输出匹配:

      # certutil -L -d /var/lib/pki/rhcs10-RSA-RootCA/alias/ -n "CA Signing Cert - rhcs10-RSA-RootCA" -a
      Copy to Clipboard Toggle word wrap
  4. 远程将新的 Server-Cert 证书复制到 rhds11.example.com。例如:

    # scp /root/.dogtag/pki_rsa_bootstrap/certs_db/Server-Cert-ocsp-rootca.pem root@rhds11.example.com:/etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/
    Copy to Clipboard Toggle word wrap

替换临时 DS 证书

rhds11.example.com 上,将临时 DS 证书替换为实际的 DS 证书:

  1. dirsrv 目录的内容保存到备份目录中:

    # cp -r /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/ /etc/dirsrv/save-rsa/slapd-CC-RSA-OCSP-rootca-LDAP/
    Copy to Clipboard Toggle word wrap
  2. 删除旧的 DS 证书:

    # certutil -D -d /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/ -f /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/pwdfile.txt -n "Server-Cert"
    Copy to Clipboard Toggle word wrap
    # certutil -D -d /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/ -f /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/pwdfile.txt -n "Self-Signed-CA"
    Copy to Clipboard Toggle word wrap
  3. 在链 1 中导入新创建的 DS 证书及其 CA 证书。例如:

    # certutil -d /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/ -f /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/pwdfile.txt -A -t "CT,C,C" -n "CA Signing Cert - rhcs10-RSA-RootCA" -i /opt/pki_rsa/rootCA.pem
    Copy to Clipboard Toggle word wrap
    # certutil -d /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/ -f /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/pwdfile.txt -A -t "u,u,u" -n "Server-Cert" -i /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/Server-Cert-ocsp-rootca.pem
    Copy to Clipboard Toggle word wrap
  4. 列出证书:

    # certutil -L -d /etc/dirsrv/slapd-CC-RSA-OCSP-rootca-LDAP/
    
    Certificate Nickname                           Trust Attributes
                                                   SSL,S/MIME,JAR/XPI
    CA Signing Cert - rhcs10-RSA-RootCA            CT,C,C
    Server-Cert                                    u,u,u
    Copy to Clipboard Toggle word wrap
  5. 启动 DS :

    # dsctl slapd-CC-RSA-OCSP-rootca-LDAP start
    Copy to Clipboard Toggle word wrap
  6. 测试以确认 LDAP 服务器已启动并在运行(如果是单独的系统,则在 CA 主机上进行测试):

    # ldapsearch -x -D "cn=Directory Manager" -H ldaps://rhds11.example.com:6636 -b "dc=example,dc=com" -w SECret.123
    Copy to Clipboard Toggle word wrap

    如果在单独的系统上测试,请在 ldapsearch 命令前面包含 CA 证书链,例如:

    # LDAPTLS_CACERT=/opt/pki_rsa/ca-chain.pem ldapsearch -x -D "cn=Directory Manager" -H ldaps://rhds11.example.com:6636 -b "dc=example,dc=com" -w SECret.123
    Copy to Clipboard Toggle word wrap

7.4.2. 为 RootCA 安装 OCSP 实例

要为 RootCA 安装 OCSP 实例,请使用单步方法或两步方法。以下流程描述了单步方法。如果要使用两步方法安装,请参阅 第 7.2.2 节 “安装方法(单步或两步)”第 7.3.2 节 “安装 RootCA 实例(两步方法)”

先决条件

流程

  1. 在所选位置(如 /root/pki_rsa)创建一个 OCSP 安装文件来生成证书请求:

    # cd /root/pki_rsa
    Copy to Clipboard Toggle word wrap
    # vi ocsp_rootca_inst.cfg
    Copy to Clipboard Toggle word wrap
    注意

    除非明确指定,否则系统证书别名将自动命名为 pki_instance_name 的值。为了避免共享 HSM 上的证书别名冲突,请为每个实例创建使用不同的实例名称。

    以下安装文件中指定的值是示例。除了更改 HSM 密码外,还要相应地编辑值,如 ports, directory, nicknames, domains…​

    [DEFAULT]
    pki_instance_name=rhcs10-RSA-OCSP-rootca
    pki_https_port=33443
    pki_http_port=33080
    
    ### Crypto Token
    pki_hsm_enable=True
    pki_hsm_libfile=/opt/nfast/toolkits/pkcs11/libcknfast.so
    pki_hsm_modulename=nfast
    pki_token_name=NHSM-CONN-XC
    pki_token_password=<YourHSMpassword>
    
    pki_audit_signing_token=NHSM-CONN-XC
    pki_audit_signing_key_algorithm=SHA256withRSA
    pki_audit_signing_key_size=2048
    pki_audit_signing_key_type=rsa
    pki_audit_signing_signing_algorithm=SHA256withRSA
    
    pki_subsystem_token=NHSM-CONN-XC
    pki_subsystem_key_algorithm=SHA256withRSA
    pki_subsystem_signing_algorithm=SHA256withRSA
    pki_subsystem_key_size=2048
    pki_subsystem_key_type=rsa
    
    pki_sslserver_token=NHSM-CONN-XC
    pki_sslserver_key_algorithm=SHA256withRSA
    pki_sslserver_signing_algorithm=SHA256withRSA
    pki_sslserver_key_size=2048
    pki_sslserver_key_type=rsa
    
    ### CA cert chain concatenated in PEM format
    pki_cert_chain_path=/opt/pki_rsa/ca-chain.pem
    
    ### Bootstrap Admin
    pki_admin_password=SECret.123
    pki_admin_key_type=rsa
    pki_admin_key_size=2048
    pki_admin_key_algorithm=SHA256withRSA
    
    ### Bootstrap Admin client dir
    pki_client_admin_cert_p12=/opt/pki_rsa/rhcs10-RSA-OCSP-rootca/ocsp_admin_cert.p12
    pki_client_database_dir=/opt/pki_rsa/rhcs10-RSA-OCSP-rootca/certs_db
    pki_client_database_password=SECret.123
    pki_client_database_purge=False
    pki_client_dir=/opt/pki_rsa/rhcs10-RSA-OCSP-rootca
    pki_client_pkcs12_password=SECret.123
    
    ### Internal LDAP
    pki_ds_bind_dn=cn=Directory Manager
    pki_ds_ldap_port=6389
    pki_ds_ldaps_port=6636
    pki_ds_password=SECret.123
    pki_ds_remove_data=True
    pki_ds_secure_connection=True
    pki_ds_secure_connection_ca_pem_file=/opt/pki_rsa/ca-chain.pem
    pki_ds_secure_connection_ca_nickname=CA Signing Cert - rhcs10-RSA-RootCA
    
    ### Security Domain
    pki_security_domain_hostname=rhcs10.example.com
    pki_security_domain_https_port=8443
    pki_security_domain_password=SECret.123
    pki_security_domain_user=caadmin
    
    
    [Tomcat]
    pki_ajp_port=33009
    pki_tomcat_server_port=33005
    
    [OCSP]
    pki_import_admin_cert=False
    
    pki_ocsp_signing_token=NHSM-CONN-XC
    pki_ocsp_signing_key_algorithm=SHA256withRSA
    pki_ocsp_signing_key_size=3072
    pki_ocsp_signing_key_type=rsa
    pki_ocsp_signing_signing_algorithm=SHA256withRSA
    
    pki_admin_nickname=PKI Bootstrap Administrator for RSA-OCSP-rootca
    pki_admin_name=ocspadmin
    pki_admin_uid=ocspadmin
    pki_admin_email=ocspadmin@example.com
    
    pki_ds_hostname=rhds11.example.com
    pki_ds_base_dn=dc=RSA-OCSP-rootca
    pki_ds_database=CC-RSA-OCSP-rootca-LDAP
    pki_share_db=False
    Copy to Clipboard Toggle word wrap
  2. 运行 pkispawn 工具来安装 OCSP 子系统:

    # pkispawn -s OCSP -f ocsp_rootca_inst.cfg --debug
    Copy to Clipboard Toggle word wrap

    这将在 /var/lib/pki/rhcs10-RSA-OCSP-rootca 中创建 OCSP 实例。

注意

为便于参考,如果您想要使用两步方法安装此 OCSP:

  1. 首先使用 --skip-configuration 选项运行 pkispawn 工具来安装 RootCA 的 OCSP 实例:

    # pkispawn -s OCSP -f ocsp_rootca_inst.cfg --skip-configuration --debug
    Copy to Clipboard Toggle word wrap
  2. 在两个安装步骤间自定义配置文件
  3. 运行 pkispawn 工具来配置 OCSP:

    # pkispawn -s OCSP -f ocsp_rootca_inst.cfg --skip-installation --debug
    Copy to Clipboard Toggle word wrap

验证

  • 显示安装的 OCSP 实例的状态:

    # pki-server status rhcs10-RSA-OCSP-rootca
    Copy to Clipboard Toggle word wrap

7.4.3. 增加 RootCA 的 OCSP pkiconsole 超时

  1. 以 root 用户身份登录 rhcs10.example.com
  2. 停止 RootCA 的 OCSP 服务:

    pki-server stop rhcs10-RSA-OCSP-rootca
    Copy to Clipboard Toggle word wrap
  3. 编辑 /var/lib/pki/rhcs10-RSA-OCSP-rootca/conf/server.xml 以增加超时时间:

    <Connector name="Secure" port="33443" …
    connectionTimeout="3000000"
    Copy to Clipboard Toggle word wrap
  4. 启动 RootCA 的 OCSP 服务:

    # pki-server start rhcs10-RSA-OCSP-rootca
    Copy to Clipboard Toggle word wrap

7.4.4. 设置默认 AIA 扩展以指向此 OCSP

默认情况下,除非明确指定,CA 使用 AIA (Authority Information Access)扩展来发布证书,指向 CA 自己的内部 OCSP。现在,您已设置了 OCSP 实例,您可以将 RootCA 配置为开始使用指向 OCSP 实例的 AIA 扩展发布证书。

以 root 用户身份在 rhcs10.example.com 上:

  1. 停止 RootCA:

    # pki-server stop rhcs10-RSA-RootCA
    Copy to Clipboard Toggle word wrap
  2. 编辑 RootCA 的 CS.cfg,并将 ca.defaultOcspUri 变量设置为 OCSP。例如:

    ca.defaultOcspUri=http://rhcs10.example.com:33080/ocsp/ee/ocsp
    Copy to Clipboard Toggle word wrap
  3. 启动 RootCA:

    # pki-server start rhcs10-RSA-RootCA
    Copy to Clipboard Toggle word wrap
注意

默认情况下,每个子系统的 OCSP URL (如 KRA)会在其 server.xml 文件中设置。启用后,这会在查找证书状态时指示 RHCS 实例使用静态 URL,而不是嵌入在对等证书中的 AIA 扩展。要使用 AIA 扩展,安装子系统时将定向到遵循 第 7.13.10.2 节 “为 CA / KRA / TKS / TPS 启用 OCSP”

7.4.5. 创建 OCSP 角色用户

  • 按照 第 7.12 节 “创建 PKI 角色用户” 中的步骤创建单角色 admin、代理、审计用户(在 OCSP 中)。为此,您需要导入 RootCA 的 OCSP bootstrap 管理员证书,即 ocsp_admin_cert.p12。例如:

    # pki -d /root/.dogtag/pki_rsa_bootstrap/certs_db -c SECret.123 client-cert-import --pkcs12 /opt/pki_rsa/rhcs10-RSA-OCSP-rootca/ocsp_admin_cert.p12 --pkcs12-password SECret.123
    
    ----------------------------------------
    Imported certificates from PKCS #12 file
    ----------------------------------------
    Copy to Clipboard Toggle word wrap

7.4.6. 使用客户端身份验证登录到 OCSP pkiconsole

  1. 使用 authType=sslclientauth 配置 OCSP,并按照 第 7.13.6 节 “使用客户端身份验证配置 pkiconsole 登录” 导入角色用户证书。
  2. 使用角色用户的客户端身份验证证书登录到 pkiconsole

    # pkiconsole -d <home .redhat-idm-console dir> -n <client cert> https://rhcs10.example.com:33443/ocsp
    Copy to Clipboard Toggle word wrap

    然后从列表中选择角色用户证书别名,如 OCSP adminV。登录到控制台应该可以成功。

7.4.7. 配置 CRL 发布

Red Hat Certificate System 提供两种 CRL 发布方法,供 CA 外部的 OCSP 实例使用:

  • 直接 CA→OCSP CRL 发布
  • 使用 CA→LDAP 间接发布,然后 OCSP5-4LDAP

默认情况下,当您设置 OCSP 实例后,会自动设置第一个 CRL 发布方法,这将允许直接 CA→OCSP CRL 发布。

本节详细介绍了第二种方法,即使 CA 将 CRL 发布到 LDAP 服务器,然后 OCSP 可以从 LDAP 服务器拉取 CRL。

7.4.7.1. 为 CRL 发布设置 LDAP 服务器

以 root 用户身份在 rhds11.example.com 上:

  1. 安装 Directory 服务器实例,CA 将使用它来发布 CRL。红帽目录服务器分别侦听 LDAP/LDAPS 端口、12389 和 12636。

    1. 使用 dscreate create-template 命令在所选位置创建一个模板 .cfg 文件(例如 /root/pki_rsa):

      # dscreate create-template /root/pki_rsa/rootca-crl-publish-ldap.cfg
      Copy to Clipboard Toggle word wrap
    2. 编辑上一步中创建的 .cfg 文件。取消注释以下参数并把它设置为自定义安装:

      full_machine_name = rhds11.example.com
      port = 12389
      secure_port = 12636
      instance_name = CC-RSA-RootCA-CRL-PUBLISH
      root_password = SECret.123
      suffix = dc=example,dc=com
      create_suffix_entry = True
      Copy to Clipboard Toggle word wrap
    3. 安装 Directory 服务器实例:

      # dscreate from-file /root/pki_rsa/rootca-crl-publish-ldap.cfg
      
      Starting installation...
      
      Completed installation for CC-RSA-RootCA-CRL-PUBLISH
      Copy to Clipboard Toggle word wrap
  2. 添加 ACI (Access Control 指令)规则以允许匿名绑定访问。默认情况下禁用它。

    1. 在所选位置(如 /root/pki_rsa/dirsrv/)创建 ldapaci.ldif 文件,其内容如下:

      dn: dc=example,dc=com
      changetype: modify
      add: aci
      aci: (targetattr!="userPassword || aci")(version 3.0; acl "Enable anonymous access"; allow (read, search, compare) userdn="ldap:///anyone";)
      Copy to Clipboard Toggle word wrap
    2. 运行 ldapmodify 命令来添加 ACI:

      # ldapmodify -x -h rhds11.example.com -p 12389 -D 'cn=Directory Manager' -W -f /root/pki_rsa/dirsrv/ldapaci.ldif
      Copy to Clipboard Toggle word wrap
  3. 准备 CRL 发布子树:

    1. /root/pki_rsa/dirsrv 目录中创建两个文件,其内容如下:

      • 对于 rootca_pki_subtree.ldif 文件:

        dn: dc=pki,dc=example,dc=com
        objectClass: domain
        dc: pki
        Copy to Clipboard Toggle word wrap
      • 对于 rootca_crl_subtree.ldif 文件:

        dn: dc=crl,dc=pki,dc=example,dc=com
        objectClass: domain
        dc: crl
        Copy to Clipboard Toggle word wrap
    2. 在 CRL 实例中添加这两个条目:

      # ldapadd -x -H ldap://rhds11.example.com:12389 -D "cn=Directory Manager" -W -f /root/pki_rsa/dirsrv/rootca_pki_subtree.ldif
      Copy to Clipboard Toggle word wrap
      # ldapadd -x -H ldap://rhds11.example.com:12389 -D "cn=Directory Manager" -W -f /root/pki_rsa/dirsrv/rootca_crl_subtree.ldif
      Copy to Clipboard Toggle word wrap

7.4.7.2. 在 RootCA 上配置 CRL 发布

配置 CRL 发布:

  1. 添加 ca.publish. 属性:

    1. 停止 RootCA 实例:

      # pki-server stop rhcs10-RSA-RootCA
      Copy to Clipboard Toggle word wrap
    2. 在 RootCA 的 CS.cfg 配置文件中配置以下属性(例如 /var/lib/pki/rhcs10-RSA-RootCA/ca/conf/CS.cfg):

      ca.publish.ldappublish.enable=true
      ca.publish.ldappublish.ldap.ldapauth.authtype=BasicAuth
      ca.publish.ldappublish.ldap.ldapauth.bindDN=cn=Directory Manager
      ca.publish.ldappublish.ldap.ldapauth.bindPWPrompt=CA LDAP Publishing
      ca.publish.ldappublish.ldap.ldapconn.host=rhds11.example.com
      ca.publish.ldappublish.ldap.ldapconn.port=12389
      ca.publish.ldappublish.ldap.ldapconn.secureConn=false
      ca.publish.publisher.instance.LdapCaCertPublisher.caCertAttr=cACertificate;binary
      ca.publish.publisher.instance.LdapCaCertPublisher.caObjectClass=pkiCA
      ca.publish.publisher.instance.LdapCaCertPublisher.pluginName=LdapCaCertPublisher
      ca.publish.mapper.instance.LdapCaCertMap.createCAEntry=true
      ca.publish.mapper.instance.LdapCaCertMap.dnPattern=cn=$subj.cn,dc=crl,dc=pki,dc=example,dc=com
      ca.publish.mapper.instance.LdapCaCertMap.pluginName=LdapCaSimpleMap
      ca.publish.rule.instance.LdapCaCertRule.enable=true
      ca.publish.rule.instance.LdapCaCertRule.mapper=LdapCaCertMap
      ca.publish.rule.instance.LdapCaCertRule.pluginName=Rule
      ca.publish.rule.instance.LdapCaCertRule.predicate=
      ca.publish.rule.instance.LdapCaCertRule.publisher=LdapCaCertPublisher
      ca.publish.rule.instance.LdapCaCertRule.type=cacert
      ca.publish.publisher.instance.LdapCrlPublisher.crlAttr=certificateRevocationList;binary
      ca.publish.publisher.instance.LdapCrlPublisher.crlObjectClass=pkiCA
      ca.publish.publisher.instance.LdapCrlPublisher.pluginName=LdapCrlPublisher
      ca.publish.mapper.instance.LdapCrlMap.createCAEntry=true
      ca.publish.mapper.instance.LdapCrlMap.dnPattern=cn=$subj.cn,dc=crl,dc=pki,dc=example,dc=com
      ca.publish.mapper.instance.LdapCrlMap.pluginName=LdapCaSimpleMap
      ca.publish.rule.instance.LdapCrlRule.enable=true
      ca.publish.rule.instance.LdapCrlRule.mapper=LdapCrlMap
      ca.publish.rule.instance.LdapCrlRule.pluginName=Rule
      ca.publish.rule.instance.LdapCrlRule.predicate=issuingPointId==MasterCRL
      ca.publish.rule.instance.LdapCrlRule.publisher=LdapCrlPublisher
      ca.publish.rule.instance.LdapCrlRule.type=crl
      ca.publish.enable=true
      Copy to Clipboard Toggle word wrap
      注意

      或者,您可以使用 ca-config-set 命令更新属性。例如:

      # pki-server ca-config-set -i rhcs10-RSA-RootCA ca.publish.ldappublish.ldap.ldapconn.host rhds11.example.com; pki-server ca-config-set -i rhcs10-RSA-RootCA ca.publish.ldappublish.ldap.ldapconn.port 12389; pki-server ca-config-set -i rhcs10-RSA-RootCA ca.publish.mapper.instance.LdapCaCertMap.dnPattern "cn=\$subj.cn,dc=crl,dc=pki,dc=example,dc=com"; pki-server ca-config-set -i rhcs10-RSA-RootCA ca.publish.mapper.instance.LdapCrlMap.dnPattern cn=\$subj.cn,dc=crl,dc=pki,dc=example,dc=com
      Copy to Clipboard Toggle word wrap

      以此类推。

      您可以使用 ca-config-show 命令检查参数是否已成功更新。例如:

      # pki-server ca-config-show -i rhcs10-RSA-RootCA ca.publish.ldappublish.ldap.ldapconn.host rhds11.example.com; pki-server ca-config-show -i rhcs10-RSA-RootCA ca.publish.ldappublish.ldap.ldapconn.port 12389; pki-server ca-config-show -i rhcs10-RSA-RootCA ca.publish.mapper.instance.LdapCaCertMap.dnPattern "cn=\$subj.cn,dc=crl,dc=pki,dc=example,dc=com"; pki-server ca-config-show -i rhcs10-RSA-RootCA ca.publish.mapper.instance.LdapCrlMap.dnPattern cn=\$subj.cn,dc=crl,dc=pki,dc=example,dc=com
      Copy to Clipboard Toggle word wrap
    3. 启动 RootCA 实例:

      pki-server start rhcs10-RSA-RootCA
      Copy to Clipboard Toggle word wrap
  2. 通过 curl 将 CRL 和 CA 证书推送到 LDAP 目录。例如:

    # curl \
        -d "xml=true" \
        --cert-type P12 \
        --cert /opt/pki_rsa/rhcs10-RSA-RootCA/ca_admin_cert.p12:SECret.123 \
        -k \
        https://rhcs10.example.com:8443/ca/agent/ca/updateCRL \
        | xmllint --format -
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <xml>
      <header>
        <crlIssuingPoint>MasterCRL</crlIssuingPoint>
        <crlUpdate>Scheduled</crlUpdate>
      </header>
      <fixed/>
      <records/>
    </xml>
    Copy to Clipboard Toggle word wrap
  3. 禁用直接 CA→OCSP CRL 发布方法:

    1. 停止 RootCA:

      pki-server stop rhcs10-RSA-RootCA
      Copy to Clipboard Toggle word wrap
    2. 编辑 CA 的 CS.cfg 配置文件(例如 /var/lib/pki/rhcs10-RSA-RootCA/ca/conf/CS.cfg),并将其设置为 false

      ca.publish.rule.instance.ocsprule-<host/port info>.enable=false
      Copy to Clipboard Toggle word wrap

      例如:

      ca.publish.rule.instance.ocsprule-rhcs10-example-com-33443.enable=false
      Copy to Clipboard Toggle word wrap
    3. 启动 CA 以使更改生效:

      # pki-server start rhcs10-RSA-RootCA
      Copy to Clipboard Toggle word wrap
  4. 使用 curl 更新目录服务器。例如:

    # curl \
      -d "updateCRL=yes&updateCA=yes&xml=true" \
      --cert-type P12 --cert /opt/pki_rsa/rhcs10-RSA-RootCA/ca_admin_cert.p12:SECret.123 \
      -k https://rhcs10.example.com:8443/ca/agent/ca/updateDir | xmllint --format -
    Copy to Clipboard Toggle word wrap
  5. 使用 curl 显示 CRL:

    # curl \
       -d "pageSize=50&crlIssuingPoint=MasterCRL&pageStart=1&crlDisplayType=entireCRL&xml=true" \
       --cert-type P12 \
       --cert /opt/pki_rsa/rhcs10-RSA-RootCA/ca_admin_cert.p12:SECret.123 \
       -k \
       https://rhcs10.example.com:8443/ca/agent/ca/displayCRL | xmllint --format -
    Copy to Clipboard Toggle word wrap
  6. 运行 ldapsearch 来验证 CRL 和 CA 证书是否已推送到 LDAP 目录:

    # ldapsearch -x -D "cn=Directory Manager" -h "rhds11.example.com" -p 12389 -b "dc=example,dc=com" -w SECret.123
    Copy to Clipboard Toggle word wrap
    . . . Output omitted . . .
    
    # CA Signing Certificate, crl.pki.example.com
    dn: cn=CA Signing Certificate,dc=crl,dc=pki,dc=example,dc=com
    cn: CA Signing Certificate
    sn: CA Signing Certificate
    objectClass: top
    objectClass: person
    objectClass: organizationalPerson
    objectClass: inetOrgPerson
    objectClass: pkiCA
    
    
    cACertificate;binary::
    MIICBzCB8AIBATANBgkqhkiG9w0BAQ0FADBdMRYwFAYDVQQKEw1FeGFtcGxlLVN1YkNBMSIwIAYDVQQLExlyaGNzOTMtVE1TLVN1YkNBLWFha2tpYW5nMR8wHQYDVQQDExZDQSBTaWduaW5nIENlcnRpZmljYXRlFw0xODAzMDkxODA
    
    . . . Output omitted . . .
    
    certificateRevocationList;binary::
    IID9DCCAtygAwIBAgIEBwa6XDANBgkqhkiG9w0BAQsFADBiMR4wHAYDVQQKDBVFeGFtcGxlLXJoY3M5My1UTVMtQ0ExHzAdBgNVBAsMFnJoY3M5My1UTVMtQ
    
    . . . Output omitted . . .
    Copy to Clipboard Toggle word wrap
  7. 禁用 RootCA 的证书发布(可选):
注意

以下流程是防止 debug 日志中出现 WARNING 信息,如下所示:

2024-01-29 00:04:10 [Thread-18] INFO: CAPublisherProcessor: No rules enabled
2024-01-29 00:04:10 [Thread-18] SEVERE: PublishProcessor::publishCert : Failed to publish using rule: No rules enabled
2024-01-29 00:04:10 [Thread-18] WARNING: Could not publish certificate serial number 0x9c2762c. Error Failed to publish using rule: No rules enabled
Failed to publish using rule: No rules enabled
Copy to Clipboard Toggle word wrap
  1. 停止 RootCA:

    # pki-server stop rhcs10-RSA-RootCA
    Copy to Clipboard Toggle word wrap
  2. 编辑 /var/lib/pki/rhcs10-RSA-RootCA/ca/conf/CS.cfg 并设置以下内容:

    ca.publish.cert.enable=false
    Copy to Clipboard Toggle word wrap
  3. 启动 RootCA 以使配置更改生效:

    # pki-server start rhcs10-RSA-RootCA
    Copy to Clipboard Toggle word wrap

7.4.7.3. 配置 OCSP 以从 LDAP 服务器拉取 CRL

当您选择替代的 CRL 发布方法时,您需要设置 OCSP,以便它知道从哪里拉取 CRL。为此,您需要配置 OCSP Revocation Info 存储信息,使其事先指向 CRL 发布 LDAP 实例(已在本章前面设置)。

配置 OCSP 撤销信息存储:

  1. 停止 OCSP:

    # pki-server stop rhcs10-RSA-OCSP-rootca
    Copy to Clipboard Toggle word wrap
  2. 在 OCSP 的 CS.cfg 配置文件中设置 ldapStore 属性(例如 /var/lib/pki/rhcs10-RSA-OCSP-rootca/ocsp/conf/CS.cfg)。确保将 ocsp.storeId 参数从 defStore 改为 ldapStore 并添加以下参数:

    ocsp.storeId=ldapStore
    ocsp.store.ldapStore.numConns=1
    ocsp.store.ldapStore.host0=rhds11.example.com
    ocsp.store.ldapStore.port0=12389
    ocsp.store.ldapStore.baseDN0=dc=crl,dc=pki,dc=example,dc=com
    ocsp.store.ldapStore.refreshInSec0=120
    ocsp.store.ldapStore.byName=true
    ocsp.store.ldapStore.caCertAttr=cACertificate;binary
    ocsp.store.ldapStore.crlAttr=certificateRevocationList;binary
    ocsp.store.ldapStore.notFoundAsGood=true
    Copy to Clipboard Toggle word wrap
    注意

    refreshInSec0 的默认值为 86400,我们将其配置为 120 用于测试,因此每 2 分钟进行 CRL 更新。

  3. 另外,为了更好地观察,您可以在 OCSP 的 CS.cfg 配置文件中将 debug 级别设置为 0,以确保 LDAPStore 更新在 debug 日志中显示。否则,它仅在没有更新时才会显示状态。

    debug.level=0
    Copy to Clipboard Toggle word wrap

    但是,请注意,这样做会快速增加调试日志的大小,特别是 OCSP 系统。因此,只在短的测试时间内推荐使用。

  4. 启动 OCSP 以使 ldapStore 配置生效:

    # pki-server start rhcs10-RSA-OCSP-rootca
    Copy to Clipboard Toggle word wrap

7.4.7.4. 测试 CRL 发布

在本节中,我们将通过创建两个用户证书来测试 CRL 发布,其中之一将被撤销。然后,我们将针对 OCSP 实例检查有效证书和撤销的证书,以验证响应是否如预期。

创建 CMC 证书

user1user2 创建代理签名的 CMC 证书,CMC 请求由 bootstrap admin 证书签名。例如,对于 user1

  1. 列出数据库中的证书:

    # certutil -d /root/.dogtag/pki_rsa_bootstrap/certs_db -L
    
    Certificate Nickname                          Trust Attributes
                                                  SSL,S/MIME,JAR/XPI
    
    PKI Bootstrap Administrator for RSA-RootCA    u,u,u
    CA Signing Cert - rhcs10-RSA-RootCA           CT,C,C
    
    . . . Output omitted . . .
    Copy to Clipboard Toggle word wrap
  2. 使用 PKCS10Client 工具生成 PKCS10 证书请求:

    # PKCS10Client -d /root/.dogtag/pki_rsa_bootstrap/certs_db -p SECret.123 -n "cn=test user1, uid=user1" -o /root/.dogtag/pki_rsa_bootstrap/certs_db/user1.req
    
    PKCS10Client: Certificate request written into /root/.dogtag/pki_rsa_bootstrap/certs_db/user1.req
    PKCS10Client: PKCS#10 request key id written into /root/.dogtag/pki_rsa_bootstrap/certs_db/user1.req.keyId
    Copy to Clipboard Toggle word wrap
  3. .keyID 文件上使用 cat 来显示密钥 ID。下一步中,您需要它作为 request.privKeyId= 字段:

    # cat /root/.dogtag/pki_rsa_bootstrap/certs_db/user1.req.keyId; echo
    Copy to Clipboard Toggle word wrap
  4. 生成 CMC 请求:

    1. 使用您在上一步中获取的 PKCS#10 请求和私钥 ID 创建 CMCRequest 配置文件。例如:

      # vi cmcRequest_p10_user1.cfg
      Copy to Clipboard Toggle word wrap
      ### numRequests: Total number of PKCS10 requests or CRMF requests.
      numRequests=1
      
      ### input: full path for the PKCS10 request or CRMF request,
      ### The content must be in Base-64 encoded format.
      ### Multiple files are supported. They must be separated by a space.
      input=/root/.dogtag/pki_rsa_bootstrap/certs_db/user1.req
      
      ### output: full path for the CMC request in binary format
      output=/root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.user1_pkcs10.req
      
      ### tokenname: name of the token where the agent signing cert can be found (default is internal)
      tokenname=internal
      
      ### nickname: nickname for the certificate that will be used to sign the CMC full request.
      ### nickname=caaadmin
      nickname=PKI Bootstrap Administrator for RSA-RootCA
      
      ### dbdir: directory for cert8.db, key3.db and secmod.db
      dbdir=/root/.dogtag/pki_rsa_bootstrap/certs_db
      
      ### password: password for cert8.db that stores the user signing certificate and keys
      password=SECret.123
      
      ### format: request format, either pkcs10 or crmf
      format=pkcs10
      
      ### identityProofV2.enable: if true, then the request will contain this control. Otherwise, false.
      ### Note that if both identityProof and identityProofV2 are enabled,
      ### identityProofV2 takes precedence; Only one of them can be active at a time
      ### Supported hashAlg are:
      ### SHA-256, SHA-384, and SHA-512
      ### Supported macAlg are:
      ### SHA-256-HMAC, SHA-384-HMAC, and SHA-512-HMAC
      identityProofV2.enable=false
      identityProofV2.hashAlg=SHA-512
      identityProofV2.macAlg=SHA-256-HMAC
      request.privKeyId=<key id output from the PKCS10Client|CRMFPopClient cert request>
      Copy to Clipboard Toggle word wrap
    2. 使用 CMCRequest 命令生成请求:

      # CMCRequest cmcRequest_p10_user1.cfg
      
      cert/key prefix =
      path = /root/.dogtag/pki_rsa_bootstrap/certs_db
      CryptoManger initialized
      token internal logged in...
      got signerCert: PKI Bootstrap Administrator for RSA-RootCA
      createPKIData: begins
      k=0
      createPKIData:  format: pkcs10
      PKCS10: PKCS10: begins
      PKCS10: PKCS10: ends
      selfSign is false...
      signData: begins:
      getPrivateKey: got signing cert
      signData:  got signer privKey
      createSignedData: begins
      getSigningAlgFromPrivate: begins.
      getSigningAlgFromPrivate: found signingKeyType=RSA
      getSigningAlgFromPrivate: using SignatureAlgorithm: RSASignatureWithSHA256Digest
      createSignedData: digest created for pkidata
      createSignedData: digest algorithm =RSASignatureWithSHA256Digest
      createSignedData: building cert chain
      signData: signed request generated.
      getCMCBlob: begins
      getCMCBlob: generating signed data
      
      The CMC enrollment request in base-64 encoded format:
      
      . . . Output omitted . . .
      
      The CMC enrollment request in binary format is stored in
      /root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.user1_pkcs10.req
      Copy to Clipboard Toggle word wrap
  5. 提交 CMC 请求:

    1. 创建 HttpClient 配置文件。例如:

      # vim /root/.dogtag/pki_rsa_bootstrap/certs_db/HttpClient_cmc_p10_user1.cfg
      Copy to Clipboard Toggle word wrap
      ### host: host name for the http server
      host=rhcs10.example.com
      
      ### port: port number
      port=8443
      
      ### secure: true for secure connection, false for nonsecure connection
      secure=true
      
      ### input: full path for the enrollment request, the content must be in binary format
      input=/root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.user1_pkcs10.req
      
      ### output: full path for the response in binary format
      output=/root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.user1_pkcs10.resp
      
      ### tokenname: name of the token where the SSL client authentication cert can be found (default is internal)
      ### This parameter will be ignored if secure=false
      tokenname=internal
      
      ### dbdir: directory for cert8.db, key3.db and secmod.db
      ### This parameter will be ignored if secure=false
      dbdir=/root/.dogtag/pki_rsa_bootstrap/certs_db/
      
      ### clientmode: true for client authentication, false for no client authentication
      ### This parameter will be ignored if secure=false
      clientmode=true
      
      ### password: password for cert8.db
      ### This parameter will be ignored if secure=false and clientauth=false
      password=SECret.123
      
      ### nickname: nickname for client certificate
      ### This parameter will be ignored if clientmode=false
      nickname=PKI Bootstrap Administrator for RSA-RootCA
      
      ### servlet: servlet name
      servlet=/ca/ee/ca/profileSubmitCMCFull?profileId=caFullCMCUserCert
      Copy to Clipboard Toggle word wrap
    2. 使用 HttpClient 命令提交请求:

      # HttpClient /root/.dogtag/pki_rsa_bootstrap/certs_db/HttpClient_cmc_p10_user1.cfg
      
      Total number of bytes read = 3453
      after SSLSocket created, thread token is NSS FIPS 140-2 User Private Key
      client cert is not null
      handshake happened
      writing to socket
      Total number of bytes read = 2590
      
      . . . Output omitted . . .
      
      The response in binary format is stored in
      /root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.user1_pkcs10.resp
      Copy to Clipboard Toggle word wrap
  6. 使用 CMCResponse 命令处理响应:

    # CMCResponse -d /root/.dogtag/pki_rsa_bootstrap/certs_db -i /root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.user1_pkcs10.resp
    
    . . . Output omitted . . .
    
    Number of controls is 1
    Control #0: CMCStatusInfoV2
       OID: {1 3 6 1 5 5 7 7 25}
       BodyList: 1
       Status: SUCCESS
    Copy to Clipboard Toggle word wrap
  7. 同样,使用适当的值重复上述步骤,为 user2 创建一个证书。

设置撤销

现在,设置撤销以撤销 user2 证书:

  1. 将 CRL 和 CA 证书推送到 LDAP 目录:

    1. 在浏览器中打开 RootCA 的 Agent UI。
    2. 选择 Update Revocation List,再点 Update
    3. Update Directory Server 并选择:

      • 将证书撤销列表更新至目录
      • 将证书管理器证书更新至目录
    4. 单击 Update Directory
    5. 等待 OCSP 的 ldapStore 刷新发生(观察 /var/lib/pki/rhcs10-RSA-OCSP-rootca/ocsp/logs/debug中的 debug 文件)。
  2. 使用 OCSPClient 工具检查证书状态。例如,使用证书序列号 user1 (十进制):

    # OCSPClient -v -d /root/.dogtag/pki_rsa_bootstrap/certs_db -h rhcs10.example.com -p 33080 -c "CA Signing Cert - rhcs10-RSA-RootCA" --serial 245832201
    
    Initializing security database
    Creating request for serial number 245832201
    Submitting OCSP request
    URL: http://rhcs10.example.com:33080/ocsp/ee/ocsp
    Request Length: 71
    Request: MEUwQzBBMD8wPTAJBgUrDgMCGgUABBRA+gjEGo4W0lUiC/Ve/oO8CrXQLQQUK4Bf
    o2u6SW0p6q58dlNCXxOVw30CBA7kEiA=
    
    Response Length: 3546
    Response: <blob>
    CertID.serialNumber=245832201
    CertStatus=Good
    Copy to Clipboard Toggle word wrap
  3. 撤销 user2 的证书:

    1. 创建 CMCRequest 配置文件。例如:

      # vi cmc-agent-signed-revoke.cfg
      Copy to Clipboard Toggle word wrap
      ### numRequests: Total number of PKCS10 requests or CRMF requests.
      numRequests=1
      
      ### output: full path for the CMC request in binary format
      output=/root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.revoke.agentSigned.req
      
      ### tokenname: name of the token where the user signing cert can be found (default is internal)
      tokenname=internal
      
      ### nickname: nickname for the signing certificate which will be used to sign the CMC full request.
      nickname=PKI Bootstrap Administrator for RSA-RootCA
      
      ### dbdir: directory for cert8.db, key3.db and secmod.db
      dbdir=/root/.dogtag/pki_rsa_bootstrap/certs_db
      
      ### password: password for cert8.db which stores the user signing certificate and keys
      password=SECret.123
      
      ### format: request format, either pkcs10 or crmf
      format=pkcs10
      
      ### revocation parameters
      revRequest.enable=true
      revRequest.serial=245832201
      revRequest.reason=unspecified
      revRequest.comment=test user2 certificate revocation
      Copy to Clipboard Toggle word wrap
    2. 使用 CMCRequest 命令生成请求:

      # CMCRequest cmc-agent-signed-revoke.cfg
      
      cert/key prefix =
      path = /root/.dogtag/pki_rsa_bootstrap/certs_db
      CryptoManger initialized
      token internal logged in...
      got signerCert: PKI Bootstrap Administrator for RSA-RootCA
      addRevRequestAttr: no sharedSecret found; request will be signed;
      addRevRequestAttr: RevokeRequest control created.
      selfSign is false...
      signData: begins:
      getPrivateKey: got signing cert
      signData:  got signer privKey
      createSignedData: begins
      getSigningAlgFromPrivate: begins.
      getSigningAlgFromPrivate: found signingKeyType=RSA
      getSigningAlgFromPrivate: using SignatureAlgorithm: RSASignatureWithSHA256Digest
      createSignedData: digest created for pkidata
      createSignedData: digest algorithm =RSASignatureWithSHA256Digest
      createSignedData: building cert chain
      signData: signed request generated.
      getCMCBlob: begins
      getCMCBlob: generating signed data
      
      The CMC enrollment request in base-64 encoded format:
      
      . . . Output omitted . . .
      
      The CMC enrollment request in binary format is stored in
      /root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.revoke.agentSigned.req
      Copy to Clipboard Toggle word wrap
    3. 创建 HttpClient 配置文件。例如:

      # vi HttpClient.revoke.agentSigned.cfg
      Copy to Clipboard Toggle word wrap
      ### CA server host name.
      host=rhcs10.example.com
      
      ### port: port number
      port=8443
      
      ### secure: true for secure connection, false for nonsecure connection
      secure=true
      
      ### input: full path for the enrollment request, the content must be in binary format
      input=/root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.revoke.agentSigned.req
      
      ### output: full path for the response in binary format
      output=/root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.revoke.agentSigned.resp
      
      ### tokenname: name of the token where the SSL client authentication cert can be found (default is internal)
      ### This parameter will be ignored if secure=false
      tokenname=internal
      
      ### dbdir: directory for cert8.db, key3.db and secmod.db
      ### This parameter will be ignored if secure=false
      dbdir=/root/.dogtag/pki_rsa_bootstrap/certs_db
      
      ### clientmode: true for client authentication, false for no client authentication
      ### This parameter will be ignored if secure=false
      clientmode=true
      
      ### password: password for cert8.db
      ### This parameter will be ignored if secure=false and clientauth=false
      password=SECret.123
      
      ### nickname: nickname for client certificate
      ### This parameter will be ignored if clientmode=false
      nickname=PKI Bootstrap Administrator for RSA-RootCA
      
      ### servlet: servlet name
      servlet=/ca/ee/ca/profileSubmitCMCFull?profileId=caFullCMCUserCert
      Copy to Clipboard Toggle word wrap
    4. 使用 HttpClient 命令提交请求:

      # HttpClient HttpClient.revoke.agentSigned.cfg
      
      Total number of bytes read = 2793
      after SSLSocket created, thread token is NSS FIPS 140-2 User Private Key
      client cert is not null
      handshake happened
      writing to socket
      Total number of bytes read = 1638
      
      . . . Output omitted . . .
      
      The response in binary format is stored in
      /root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.revoke.agentSigned.resp
      Copy to Clipboard Toggle word wrap
    5. 处理 CMC 响应:

      # CMCResponse -d /root/.dogtag/pki_rsa_bootstrap/certs_db -i /root/.dogtag/pki_rsa_bootstrap/certs_db/cmc.revoke.agentSigned.resp
      
      . . . Output omitted . . .
      
      Number of controls is 1
      Control #0: CMCStatusInfoV2
        OID: {1 3 6 1 5 5 7 7 25}
        BodyList: 1
        Status: SUCCESS
      Copy to Clipboard Toggle word wrap

验证

  1. 在 CA 签名的审计日志中进行验证,例如 /var/log/pki/rhcs10-RSA-RootCA/ca/signedAudit/ca_audit,代表 user2 证书被撤销。
  2. 等待下一个 CRL autoupdate (以分钟为单位)由 RootCA 的 CS.cfg 文件的 ca.crl.MasterCRL.autoUpdateInterval 配置。默认情况下,这设置为 240 分钟。

    注意

    或者,如果要立即手动更新 CRL,请在浏览器中登录到 RootCA 的 Agent UI,并:

    1. 选择 Update Revocation List,再点 Update
    2. Update Directory Server 并选择:

      • 将证书撤销列表更新至目录
      • 将证书管理器证书更新至目录
    3. 单击 Update Directory

    ldapStore 刷新完成后,观察 /var/lib/pki/rhcs10-RSA-OCSP-rootca/ocsp/logs/debug 中的 debug 文件。

  3. 使用 OCSPCLient 工具验证 user2 的证书已撤销,使用十进制十进制表示的序列号(使用 指向签名 CA 别名的 nickname):

    # OCSPClient -v -d /root/.dogtag/pki_rsa_bootstrap/certs_db -h rhcs10.example.com -p 33080 -c "CA Signing Cert - rhcs10-RSA-RootCA" --serial 245832201
    
    Initializing security database
    Creating request for serial number 245832201
    Submitting OCSP request
    URL: http://rhcs10.example.com:33080/ocsp/ee/ocsp
    Request Length: 71
    Request: MEUwQzBBMD8wPTAJBgUrDgMCGgUABBRA+gjEGo4W0lUiC/Ve/oO8CrXQLQQUK4Bf
    o2u6SW0p6q58dlNCXxOVw30CBA7kEiA=
    
    Response Length: 3563
    Response: <blob>
    CertID.serialNumber=245832201
    CertStatus=Revoked
    Copy to Clipboard Toggle word wrap

ocsp.store.ldapStore.refreshInSec0 设置为所需的值

在以前的版本中,我们设置 ocsp.store.ldapStore.refreshInSec0=120 以便更快地进行 CRL 刷新(2 分钟)用于测试。

  • 请将 OCSP 的 CS.cfg 中的值更改为您所需的值(以秒为单位),将 debug 级别更新为 10 并重启 OCSP。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat