5.6.3.3. 为用户获取仅限加密的证书
本节论述了获取只使用加密的证书(使用现有用户签名证书签名的证书)的工作流:
注意
如果用户拥有多个用于不同使用情况的证书(在签名的情况下),用户必须首先获取签名证书。用户拥有签名证书后,就可以使用它进行 概念验证,而无需设置并依赖 CMC 共享 Secret 机制。
有关获取用户的第一个签名证书的详情,请参考 第 5.6.3.2 节 “获取用户的第一个签名证书”。
作为用户:
- 使用存储在网络安全服务(NSS)数据库中或包含用户签名证书和密钥的智能卡中的加密令牌。
- 以 PKCS #10 或 CRMF 格式生成 CSR。注意如果需要密钥归档,请使用 CRMF 格式。
- 生成 CMC 请求。由于这是仅加密的证书,因此私钥无法签名。因此,不包括概念验证(POP)。因此,注册需要两个步骤:如果初始请求成功,则以
EncryptedPOP
控制形式生成 CMC 状态。然后,用户使用响应并生成包含DecryptedPOP
控制的 CMC 请求,并在第二步提交它。- 对于第一步,除了默认参数外,用户还必须在传递到
CMCRequest
工具的配置文件中设置以下参数:identification.enable
witness.sharedSecret
identityProofV2.enable
identityProofV2.hashAlg
identityProofV2.macAlg
popLinkWitnessV2.enable
(CA 需要)popLinkWitnessV2.keyGenAlg
(CA 需要)popLinkWitnessV2.macAlg
(如果需要)request.privKeyId
详情请查看 CMCRequest(1) man page。响应包含:- CMC 加密 POP 控制
- 使用 POP 所需 错误进行
CMCStatusInfoV2
控制 - 请求 ID
- 对于第二个步骤,除了默认参数外,用户还必须在传递到
CMCRequest
工具的配置文件中设置以下参数:decryptedPop.enable
encryptedPopResponseFile
decryptedPopRequestFile
request.privKeyId
详情请查看 CMCRequest(1) man page。
5.6.3.3.1. 使用密钥 Archival 的只加密证书示例
要执行密钥存档的注册,生成 CMC 请求,该请求包含在 CRMF 请求中包含该用户的加密私钥。以下流程假设该用户已经拥有了签名证书。此签名证书的 nickname 在流程中的配置文件中设置。
注意
以下步骤描述了两个条带的提示与加密密钥一起使用,该密钥无法用于签名。如果您使用可签署证书的密钥,请将
-q POP_SUCCESS
选项而不是 -q POP_NONE
传递给 single-trip 的 CRMFPopClient
实用程序。
有关将
CRMFPoPClient
与 POP_SUCCESS 搭配使用,请参阅 第 5.2.1.3.1 节 “使用 CRMFPopClient
创建带有密钥 Archival 的 CSR” 和 第 5.2.1.3.2 节 “使用 CRMFPopClient
为基于 SharedSecret 的 CMC 创建 CSR”。
- 搜索 KRA 传输证书。例如:
$ pki cert-find --name KRA_transport_certificate_subject_CN
- 使用您在上一步中检索的 KRA 传输证书的序列号,将证书存储在文件中。例如,要在
/home/user_name/kra.cert
文件中存储带有 12345 序列号的证书:$ pki cert-show 12345 --output /home/user_name/kra.cert
- 使用
CRMFPopClient
实用程序:- 使用密钥归档创建 CSR:
- 进入请求证书的用户或实体的证书数据库目录,例如:
$ cd /home/user_name/
- 使用
CRMFPopClient
实用程序创建 CRMF 请求,其中 RSA 私钥由 KRA 传输证书包装。例如,将请求存储在/home/user_name/crmf.req
文件中:$ CRMFPopClient -d . -p token_password -n subject_DN -q POP_NONE \ -b /home/user_name/kra.cert -w "AES/CBC/PKCS5Padding" \ -v -o /home/user_name/crmf.req
记录命令显示的私钥的 ID。在第二个行的配置文件中,需要后续步骤中的request.privKeyId
参数作为值。
- 为
CRMRequest
实用程序创建一个配置文件,如/home/user_name/cmc.cfg
,其中包含以下内容:#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 input=/home/user_name/crmf.req #output: full path for the CMC request in binary format output=/home/user_name/cmc.req #tokenname: name of token where agent signing cert can be found #(default is internal) tokenname=internal #nickname: nickname for user certificate which will be used #to sign the CMC full request. nickname=signing_certificate #dbdir: directory for cert8.db, key3.db and secmod.db dbdir=/home/user_name/.dogtag/nssdb/ #password: password for cert8.db which stores the agent certificate password=password #format: request format, either pkcs10 or crmf format=crmf
- 创建 CMC 请求:
$ CMCRequest /home/user_name/cmc.cfg
如果命令成功,则 CMCRequest 程序会在请求配置文件的output
参数中指定的文件中存储 CMC 请求。 - 为
HttpClient
创建配置文件,如/home/user_name/cmc-submit.cfg
,您要在以后的步骤中使用该文件来向 CA 提交 CMC 请求。在创建的文件中添加以下内容:#host: host name for the http server host=server.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=/home/user_name/cmc.req #output: full path for the response in binary format output=/home/user_name/cmc-response_round_1.bin #tokenname: name of token where TLS 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=/home/user_name/.dogtag/nssdb/ #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=password #nickname: nickname for client certificate #This parameter will be ignored if clientmode=false nickname=signing_certificate #servlet: servlet name servlet=/ca/ee/ca/profileSubmitUserSignedCMCFull?profileId=caFullCMCUserSignedCert
- 将 CMC 请求提交到 CA:
$ HttpClient /home/user_name/cmc-submit.cfg
如果命令成功,HTTPClient 程序会在配置文件的output
参数中指定的文件中存储 CMC 响应。 - 通过将响应文件传递给
CMCResponse
实用程序来验证响应。例如:$ CMCResponse -d /home/user_name/.dogtag/nssdb/ -i /home/user_name/cmc-response_round_1.bin
如果第一个条带成功,CMCResponse
会显示类似如下的输出:Certificates: Certificate: Data: Version: v3 Serial Number: 0x1 Signature Algorithm: SHA256withRSA - 1.2.840.113549.1.1.11 Issuer: CN=CA Signing Certificate,OU=pki-tomcat,O=unknown00262DFC6A5E Security Domain Validity: Not Before: Wednesday, May 17, 2017 6:06:50 PM PDT America/Los_Angeles Not After: Sunday, May 17, 2037 6:06:50 PM PDT America/Los_Angeles Subject: CN=CA Signing Certificate,OU=pki-tomcat,O=unknown00262DFC6A5E Security Domain ... Number of controls is 3 Control #0: CMC encrypted POP OID: {1 3 6 1 5 5 7 7 9} encryptedPOP decoded Control #1: CMCStatusInfoV2 OID: {1 3 6 1 5 5 7 7 25} BodyList: 1 OtherInfo type: FAIL failInfo=POP required Control #2: CMC ResponseInfo requestID: 15
- 对于第二个条带,为 Decrypt
edPOP 创建配置文件
,如/home/user_name/cmc_DecryptedPOP.cfg
,您要在以后的步骤中使用。在创建的文件中添加以下内容:#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 #this field is actually unused in 2nd trip input=/home/user_name/crmf.req #output: full path for the CMC request in binary format #this field is actually unused in 2nd trip output=/home/user_name/cmc2.req #tokenname: name of token where agent signing cert can be found #(default is internal) tokenname=internal #nickname: nickname for agent certificate which will be used #to sign the CMC full request. nickname=signing_certificate #dbdir: directory for cert8.db, key3.db and secmod.db dbdir=/home/user_name/.dogtag/nssdb/ #password: password for cert8.db which stores the agent #certificate password=password #format: request format, either pkcs10 or crmf format=crmf decryptedPop.enable=true encryptedPopResponseFile=/home/user_name/cmc-response_round_1.bin request.privKeyId=-25aa0a8aad395ebac7e6a19c364f0dcb5350cfef decryptedPopRequestFile=/home/user_name/cmc.DecryptedPOP.req
- 创建
DecryptPOP
CMC 请求:$ CMCRequest /home/user_name/cmc.DecryptedPOP.cfg
如果命令成功,CM CRequest 程序会在请求配置文件的decryptedPopRequestFile
参数中指定的文件中存储 CMC 请求。 - 为
HttpClient
创建配置文件,如/home/user_name/decrypted_POP_cmc-submit.cfg
,您可以使用该文件来向 CA 提交DecryptedPOP
CMC 请求。在创建的文件中添加以下内容:#host: host name for the http server host=server.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=/home/user_name/cmc.DecryptedPOP.req #output: full path for the response in binary format output=/home/user_name/cmc-response_round_2.bin #tokenname: name of token where TLS 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=/home/user_name/.dogtag/nssdb/ #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=password #nickname: nickname for client certificate #This parameter will be ignored if clientmode=false nickname=singing_certificate #servlet: servlet name servlet=/ca/ee/ca/profileSubmitUserSignedCMCFull?profileId=caFullCMCUserCert
- 将
DecryptedPOP
CMC 请求提交到 CA:$ HttpClient /home/user_name/decrypted_POP_cmc-submit.cfg
如果命令成功,HTTPClient 程序会在配置文件的output
参数中指定的文件中存储 CMC 响应。 - 要将 CMC 响应转换为 PKCS #7 证书链,将 CMC 响应文件传递给
CMCResponse
工具的-i
参数。例如:$ CMCResponse -i /home/user_name/cmc-response_round_2.bin -o /home/user_name/certs.p7
另外,要以 PEM 格式显示各个证书,请将-v
传递给 实用程序。如果第二个条带成功,则CMCResponse
会显示类似如下的输出:Certificates: Certificate: Data: Version: v3 Serial Number: 0x2D Signature Algorithm: SHA256withRSA - 1.2.840.113549.1.1.11 Issuer: CN=CA Signing Certificate,OU=pki-tomcat,O=unknown00262DFC6A5E Security Domain Validity: Not Before: Thursday, June 15, 2017 3:43:45 PM PDT America/Los_Angeles Not After: Tuesday, December 12, 2017 3:43:45 PM PST America/Los_Angeles Subject: CN=user_name,UID=example,OU=keyArchivalExample ... Number of controls is 1 Control #0: CMCStatusInfo OID: {1 3 6 1 5 5 7 7 1} BodyList: 1 Status: SUCCESS