5.2. 创建证书签名请求

通常,以下方法用于生成证书请求(CSR):
  • 使用命令行工具生成 CSR
  • 在支持的浏览器中生成 CSR
  • 在应用程序内生成 CSR,如服务器的安装程序
其中一些方法支持直接提交 CSR,而有些方法则不支持。
从 RHCS 9.7 开始,支持 Server-Side 键生成来克服在较新版本的浏览器(如 Firefox v69 和 up)中消除密钥生成带来的不便性。因此,在本节中,我们将不讨论密钥生成浏览器支持。虽然没有原因认为这些浏览器的旧版本不应与旧的 RHCS 文档中所述继续工作。
从应用程序生成的 CSR 通常采用 PKCS#10 的形式。如果它们正确生成,则 RHCS 应该支持它们。
在以下小节中,我们将深入介绍 RHCS 支持的以下方法:
  • 命令行工具
  • 服务器侧密钥生成

5.2.1. 使用命令行工具生成 CSR

Red Hat Certificate System 支持使用以下工具创建 CSR:
  • certutil :支持创建 PKCS #10 请求。
  • PKCS10Client :支持创建 PKCS #10 请求。
  • CRMFPopClient :支持创建 CRMF 请求。
  • pki client-cert-request: 支持 PKCS#10 和 CRMF 请求。
以下小节介绍了如何将这些实用程序与功能丰富的注册配置集框架搭配使用的一些示例。

5.2.1.1. 使用 certutil创建 CSR

这部分论述了如何使用 certutil 工具创建 CSR 的示例。
有关使用 certutil 的详情,请参考:
  • certutil(1) man page
  • certutil --help 命令的输出
5.2.1.1.1. 使用 certutil 创建带有 EC 密钥的 CSR
以下流程演示了如何使用 certutil 实用程序创建 Elliptic Curve(EC)密钥对和 CSR:
  1. 进入请求证书的用户或实体的证书数据库目录,例如:
    $ cd /user_or_entity_database_directory/
  2. 创建二进制 CSR,并将其存储在 /user_or_entity_database_directory/request.csr 文件中:
    $ certutil -d . -R -k ec -q nistp256 -s "CN=subject_name" -o /user_or_entity_database_directory/request-bin.csr
    提示时输入所需的 NSS 数据库密码。
    有关参数的详情,请查看 certutil(1) man page。
  3. 将创建的二进制格式 CSR 转换为 PEM 格式:
    $ BtoA /user_or_entity_database_directory/request-bin.csr /user_or_entity_database_directory/request.csr
  4. (可选)验证 CSR 文件是否正确:
    $ cat /user_or_entity_database_directory/request.csr
    
    		MIICbTCCAVUCAQAwKDEQMA4GA1UEChMHRXhhbXBsZTEUMBIGA1UEAxMLZXhhbXBs
    		...
    
    这是一个 PKCS#10 PEM 证书请求。
5.2.1.1.2. 使用 certutil 使用用户定义的扩展来创建 CSR
以下流程演示了如何使用 certutil 实用程序使用用户定义的扩展创建 CSR。
请注意,注册请求受 CA 定义的注册配置集的限制。请参阅 例 B.3 “CSR 中的多个用户提供的扩展”
  1. 进入请求证书的用户或实体的证书数据库目录,例如:
    $ cd /user_or_entity_database_directory/
  2. 使用用户定义的 Key Usage 扩展创建 CSR,以及用户定义的扩展密钥使用扩展,并将其存储在 /user_or_entity_database_directory/request.csr 文件中:
    $ certutil -d . -R -k rsa -g 1024 -s "CN=subject_name" --keyUsage keyEncipherment,dataEncipherment,critical --extKeyUsage timeStamp,msTrustListSign,critical -a -o /user_or_entity_database_directory/request.csr
    提示时输入所需的 NSS 数据库密码。
    有关参数的详情,请查看 certutil(1) man page。
  3. (可选)验证 CSR 文件是否正确:
    $ cat /user_or_entity_database_directory/request.csr
    		Certificate request generated by NSS certutil
    		Phone: (not specified)
    
    		Common Name: user 4-2-1-2
    		Email: (not specified)
    		Organization: (not specified)
    		State: (not specified)
    		Country: (not specified)
    这是一个 PKCS#10 PEM 证书请求。

5.2.1.2. 使用 PKCS10Client创建 CSR

这部分论述了如何使用 PKCS10Client 实用程序创建 CSR 的示例。
有关使用 PKCS10Client 的详情,请参考:
  • PKCS10Client(1) man page
  • PKCS10Client --help 命令的输出
5.2.1.2.1. 使用 PKCS10Client 创建 CSR
以下流程解释了如何使用 PKCS10Client 实用程序创建 Elliptic Curve(EC)密钥对和 CSR:
  1. 进入请求证书的用户或实体的证书数据库目录,例如:
    $ cd /user_or_entity_database_directory/
  2. 创建 CSR,并将其存储在 /user_or_entity_database_directory/example.csr 文件中:
    $ PKCS10Client -d . -p NSS_password -a ec -c nistp256 -o /user_or_entity_database_directory/example.csr -n "CN=subject_name"
    有关参数的详情,请查看 PKCS10Client(1) man page。
  3. (可选)验证 CSR 是否正确:
    $ cat /user_or_entity_database_directory/example.csr
    		-----BEGIN CERTIFICATE REQUEST-----
    		MIICzzCCAbcCAQAwgYkx
    		...
    		-----END CERTIFICATE REQUEST-----
5.2.1.2.2. 使用 PKCS10Client 为基于 SharedSecret 的 CMC 创建 CSR
以下流程解释了如何使用 PKCS10Client 程序为基于 SharedSecret 的 CMC 创建 RSA 密钥对和 CSR。它仅与 CMC Shared Secret 身份验证方法一起使用,默认由 caFullCMCSharedTokenCertcaECFullCMCSharedTokenCert 配置集处理。
  1. 进入请求证书的用户或实体的证书数据库目录,例如:
    $ cd /user_or_entity_database_directory/
  2. 创建 CSR,并将其存储在 /user_or_entity_database_directory/example.csr 文件中:
    $ PKCS10Client -d . -p NSS_password -o /user_or_entity_database_directory/example.csr -y true -n "CN=subject_name"
    有关参数的详情,请查看 PKCS10Client(1) man page。
  3. (可选)验证 CSR 是否正确:
    $ cat /user_or_entity_database_directory/example.csr
    		-----BEGIN CERTIFICATE REQUEST-----
    		MIICzzCCAbcCAQAwgYkx
    		...
    		-----END CERTIFICATE REQUEST-----

5.2.1.3. 使用 CRMFPopClient创建 CSR

证书请求消息格式(CRMF)是 CMC 中接受的 CSR 格式,允许密钥存档信息安全地嵌入到请求中。
本节介绍如何使用 CRMFPopClient 实用程序创建 CSR 的示例。
有关使用 CRMFPopClient 的详情,请查看 CRMFPopClient(1) man page。
5.2.1.3.1. 使用 CRMFPopClient 创建带有密钥 Archival 的 CSR
以下流程解释了如何使用 CRMFPopClient 实用程序创建 RSA 密钥对,并使用密钥归档选项创建 CSR:
  1. 进入请求证书的用户或实体的证书数据库目录,例如:
    $ cd /user_or_entity_database_directory/
  2. 检索 KRA 传输证书:
    $ pki ca-cert-find --name "DRM Transport Certificate"
    		---------------
    		1 entries found
    		---------------
    			Serial Number: 0x7
    			Subject DN: CN=DRM Transport Certificate,O=EXAMPLE
    			Status: VALID
    			Type: X.509 version 3
    			Key A    lgorithm: PKCS #1 RSA with 2048-bit key
    			Not Valid Before: Thu Oct 22 18:26:11 CEST 2015
    			Not Valid After: Wed Oct 11 18:26:11 CEST 2017
    			Issued On: Thu Oct 22 18:26:11 CEST 2015
    			Issued By: caadmin
    		----------------------------
    		Number of entries returned 1
  3. 导出 KRA 传输证书:
    $ pki ca-cert-show 0x7 --output kra.transport
  4. 创建 CSR,并将其存储在 /user_or_entity_database_directory/example.csr 文件中:
    $ CRMFPopClient -d . -p password -n "cn=subject_name" -q POP_SUCCESS -b kra.transport -w "AES/CBC/PKCS5Padding" -v -o /user_or_entity_database_directory/example.csr
    要创建 Elliptic Curve(EC)密钥对和 CSR,将 -a ec -t false 选项传递给该命令。
    有关参数的详情,请查看 CRMFPopClient(1) man page。
  5. (可选)验证 CSR 是否正确:
    $ cat /user_or_entity_database_directory/example.csr
    		-----BEGIN CERTIFICATE REQUEST-----
    		MIICzzCCAbcCAQAwgYkx
    		...
    		-----END CERTIFICATE REQUEST-----
5.2.1.3.2. 使用 CRMFPopClient 为基于 SharedSecret 的 CMC 创建 CSR
以下流程解释了如何使用 CRMFPopClient 程序为基于 SharedSecret 的 CMC 创建 RSA 密钥对和 CSR。它仅与 CMC Shared Secret 身份验证方法一起使用,默认由 caFullCMCSharedTokenCertcaECFullCMCSharedTokenCert 配置集处理。
  1. 进入请求证书的用户或实体的证书数据库目录,例如:
    $ cd /user_or_entity_database_directory/
  2. 检索 KRA 传输证书:
    $ pki ca-cert-find --name "DRM Transport Certificate"
    		---------------
    		1 entries found
    		---------------
    			Serial Number: 0x7
    			Subject DN: CN=DRM Transport Certificate,O=EXAMPLE
    			Status: VALID
    			Type: X.509 version 3
    			Key A    lgorithm: PKCS #1 RSA with 2048-bit key
    			Not Valid Before: Thu Oct 22 18:26:11 CEST 2015
    			Not Valid After: Wed Oct 11 18:26:11 CEST 2017
    			Issued On: Thu Oct 22 18:26:11 CEST 2015
    			Issued By: caadmin
    		----------------------------
    		Number of entries returned 1
  3. 导出 KRA 传输证书:
    $ pki ca-cert-show 0x7 --output kra.transport
  4. 创建 CSR,并将其存储在 /user_or_entity_database_directory/example.csr 文件中:
    $ CRMFPopClient -d . -p password -n "cn=subject_name" -q POP_SUCCESS -b kra.transport -w "AES/CBC/PKCS5Padding" -y -v -o /user_or_entity_database_directory/example.csr
    要创建 EC 密钥对和 CSR,将 -a ec -t false 选项传递给该命令。
    有关参数的详情,请查看 CRMFPopClient --help 命令的输出。
  5. (可选)验证 CSR 是否正确:
    $ cat /user_or_entity_database_directory/example.csr
    		-----BEGIN CERTIFICATE REQUEST-----
    		MIICzzCCAbcCAQAwgYkx
    		...
    		-----END CERTIFICATE REQUEST-----

5.2.1.4. 在 PKI CLI 中使用 client-cert-request 创建 CSR

pki命令行工具也可以与 client-cert-request 命令一起使用,以生成 CSR。但是,与之前讨论的工具不同,使用 pki 生成的 CSR 将直接提交到 CA。可以生成 PKCS#10 或 CRMF 请求。
生成 PKCS#10 请求的示例:
pki -d user token db directory -P https -p 8443 -h host.test.com -c user token db passwd client-cert-request "uid=test2" --length 4096 --type pkcs10
生成 CRMF 请求的示例:
pki -d user token db directory -P https -p 8443 -h host.test.com -c user token db passwd client-cert-request "uid=test2" --length 4096 --type crmf
成功时将返回请求 id。
提交请求后,代理可以通过使用 pki ca-cert-request-approve 命令批准它。
例如:
pki -d agent token db directory -P https -p 8443 -h host.test.com -c agent token db passwd -n <CA agent cert nickname> ca-cert-request-approve request id
如需更多信息,请参阅 pki client-cert-request --help 命令的 man page。