2.5.4. 使用 CA 创建 Signed PKCS#12 Certificates

要执行的子步骤

如果您设置了私有 CA,如 第 2.5.2 节 “设置您的 Own CA” 所述,您现在已准备好创建并签名您自己的证书。

要创建并签名 PKCS#12 格式 CertName.p12 的证书,请执行以下子步骤:

在您的 PATH 中添加 bin 目录

如果您还没有这样做,请在路径中添加 OpenSSL bin 目录,如下所示:

Windows

> set PATH=OpenSSLDir\bin;%PATH%

UNIX

% PATH=OpenSSLDir/bin:$PATH; export PATH

此步骤使 openssl 实用程序可从命令行使用。

配置 subjectAltName 扩展(可选)

执行这一步,如果您为客户端强制执行 URL 完整性检查的 HTTPS 服务器,并且计划在多设备主机上部署服务器,或者带有几个 DNS 名称别名(例如,如果您在多主 Web 服务器上部署证书)的 HTTPS 服务器,请执行这个步骤。在这种情况下,证书身份必须与多个主机名匹配,这只能通过添加 subjectAltName 证书扩展名来实现(请参阅 第 2.4 节 “对 HTTPS 证书进行特殊要求”)。

要配置 subjectAltName 扩展,请编辑 CA 的 openssl.cnf 文件,如下所示:

  1. 将以下 req_extensions 设置添加到 [req] 部分(如果 openssl.cnf 文件中不存在):

    # openssl Configuration File
    ...
    [req]
    req_extensions=v3_req
  2. 添加 [v3_req] 部分标题(如果 openssl.cnf 文件中不存在)。在 [v3_req] 部分,添加或修改 subjectAltName 设置,并将其设置为 DNS 主机名列表。例如,如果服务器主机支持替代 DNS 名称 www.redhat.comjboss.org,请按如下所示设置 subjectAltName

    # openssl Configuration File
    ...
    [v3_req]
    subjectAltName=DNS:www.redhat.com,DNS:jboss.org
  3. 在适当的 CA 配置部分添加 copy_extensions 设置。用于签名证书的 CA 配置部分是以下之一:

    • openssl ca 命令的 -name 选项指定的部分,
    • [ca] 部分下指定 default_ca 设置的部分(通常为 [CA_default])。

      例如,如果适当的 CA 配置部分为 [CA_default],请设置 copy_extensions 属性,如下所示:

      # openssl Configuration File
      ...
      [CA_default]
      copy_extensions=copy

      此设置确保证书签名请求中存在的证书扩展被复制到签名证书中。

创建证书签名请求

CertName.p12 证书创建新证书签名请求(CSR),如下所示:

openssl req -new -config X509CA/openssl.cnf -days 365 -out X509CA/certs/CertName_csr.pem -keyout X509CA/certs/CertName_pk.pem

这个命令提示您输入证书的私钥的密码短语,以及证书可识别名称的信息。

CSR 可识别名称中的一些条目必须与 CA 证书中的值匹配(在 openssl.cnf 文件的 CA Policy 部分中指定)。默认的 openssl.cnf 文件要求以下条目匹配:

  • 国家/地区名称
  • 州或省名称
  • 机构名称

证书主题 DN 的 Common Name 是通常用于代表证书所有者的身份的字段。通用名称必须符合以下条件:

  • 对于 OpenSSL 证书颁发机构生成的每个证书,通用名称必须 不同
  • 如果您的 HTTPS 客户端实现了 URL 完整性检查,您必须确保 Common Name 与要部署的证书的 DNS 名称相同(请参阅 第 2.4 节 “对 HTTPS 证书进行特殊要求”)。
注意

对于 HTTPS URL 完整性检查的目的,subjectAltName 扩展优先于 Common Name。

Using configuration from X509CA/openssl.cnf
Generating a 512 bit RSA private key
.++
.++
writing new private key to
      'X509CA/certs/CertName_pk.pem'
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be
incorporated into your certificate request.
What you are about to enter is what is called a Distinguished
Name or a DN. There are quite a few fields but you can leave
some blank. For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:IE
State or Province Name (full name) []:Co. Dublin
Locality Name (eg, city) []:Dublin
Organization Name (eg, company) []:Red Hat
Organizational Unit Name (eg, section) []:Systems
Common Name (eg, YOUR name) []:Artix
Email Address []:info@redhat.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:Red Hat

为 CSR 签名

使用您的 CA 为 CSR 签名,如下所示:

openssl ca -config X509CA/openssl.cnf -days 365 -in X509CA/certs/CertName_csr.pem -out X509CA/certs/CertName.pem

此命令需要与 new_ca.pem CA 证书关联的私钥的密码短语。例如:

Using configuration from X509CA/openssl.cnf
Enter PEM pass phrase:
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName :PRINTABLE:'IE'
stateOrProvinceName :PRINTABLE:'Co. Dublin'
localityName :PRINTABLE:'Dublin'
organizationName :PRINTABLE:'Red Hat'
organizationalUnitName:PRINTABLE:'Systems'
commonName :PRINTABLE:'Bank Server Certificate'
emailAddress :IA5STRING:'info@redhat.com'
Certificate is to be certified until May 24 13:06:57 2000 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

要成功为证书签名,您必须输入 CA 私钥密码短语(请参阅 第 2.5.2 节 “设置您的 Own CA”)。

注意

如果您没有在 openssl.cnf 文件的 [CA_default] 部分下设置 copy_extensions=copy,则签名证书不会包括原始 CSR 中的任何证书扩展。

连接文件

连接 CA 证书文件、CertName.pem 证书文件和 CertName_pk.pem 私钥文件,如下所示:

Windows

copy X509CA\ca\new_ca.pem + X509CA\certspass:quotes[_CertName_].pem + X509CA\certspass:quotes[_CertName_]_pk.pem X509CA\certspass:quotes[_CertName_]_list.pem

UNIX

cat X509CA/ca/new_ca.pem X509CA/certs/CertName.pem X509CA/certs/CertName_pk.pem > X509CA/certs/CertName_list.pem

创建 PKCS#12 文件

CertName_list.pem 文件中创建一个 PKCS#12 文件,如下所示:

openssl pkcs12 -export -in X509CA/certs/CertName_list.pem -out X509CA/certs/CertName.p12 -name "New cert"

系统会提示您输入一个密码来加密 PKCS#12 证书。此密码通常与 CSR 密码相同(许多证书存储库需要)。

根据需要重复步骤

重复步骤 3 到 6,为您的系统创建完整的证书集合。

(可选)清除 subjectAltName 扩展

为特定主机机器生成证书后,建议清除 openssl.cnf 文件中的 subjectAltName 设置,以避免意外将错误 DNS 名称分配给另一组证书。

openssl.cnf 文件中,注释掉 subjectAltName 设置(在行首添加一个 # 字符),并注释掉 copy_extensions 设置。