2.5. 创建您自己的证书

2.5.1. 先决条件

openssl 工具程序

本节中描述的步骤基于 OpenSSL 项目中的 OpenSSL 命令行工具。有关 OpenSSL 命令行工具的其他文档,请参阅 http://www.openssl.org/docs/

CA 目录结构示例

为了说明这一点,假设 CA 数据库具有以下目录结构:

X509CA/ca

X509CA/certs

X509CA/newcerts

X509CA/crl

其中 X509CA 是 CA 数据库的父目录。

2.5.2. 设置您的 Own CA

要执行的子步骤

这部分论述了如何设置您自己的私有 CA。在为实际部署设置 CA 之前,请阅读 第 2.2.3 节 “私有证书颁发机构” 中的其他注释。

要设置您自己的 CA,请执行以下步骤:

在您的 PATH 中添加 bin 目录

在安全 CA 主机上,将 OpenSSL bin 目录添加到您的路径中:

Windows

> set PATH=OpenSSLDir\bin;%PATH%

UNIX

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

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

创建 CA 目录树

创建新目录 X509CA,以容纳新 CA。该目录用于保存与 CA 关联的所有文件。在 X509CA 目录下,创建以下目录层次结构:

X509CA/ca

X509CA/certs

X509CA/newcerts

X509CA/crl

复制并编辑 openssl.cnf 文件

将 OpenSSL 安装中的 openssl.cnf 示例复制到 X509CA 目录。

编辑 openssl.cnf 以反映 X509CA 目录的目录结构,并识别新 CA 使用的文件。

编辑 openssl.cnf 文件的 [CA_default] 部分,使其类似如下:

#############################################################
[ CA_default ]

dir        = X509CA            # Where CA files are kept
certs      = $dir/certs  # Where issued certs are kept
crl_dir    = $dir/crl          # Where the issued crl are kept
database   = $dir/index.txt    # Database index file
new_certs_dir = $dir/newcerts  # Default place for new certs

certificate   = $dir/ca/new_ca.pem # The CA certificate
serial        = $dir/serial        # The current serial number
crl           = $dir/crl.pem       # The current CRL
private_key   = $dir/ca/new_ca_pk.pem  # The private key
RANDFILE      = $dir/ca/.rand
# Private random number file

x509_extensions = usr_cert  # The extensions to add to the cert
...

此时您可以决定编辑 OpenSSL 配置的其他详情,请参阅 http://www.openssl.org/docs/

初始化 CA 数据库

X509CA 目录中,初始化两个文件,串行index.txt

Windows

要在 Windows 中初始化 串行 文件,请输入以下命令:

> echo 01 > serial

要创建空文件 index.txt,在 Windows 的 X509CA 目录中从命令行启动 Windows Notepad,如下所示:

> notepad index.txt

为了响应带有文本的对话框,Cannot find text.txt 文件。您要创建新文件?,点击 ,并关闭 Notepad。

UNIX

要在 UNIX 中初始化 串行 文件和 index.txt 文件,请输入以下命令:

% echo "01" > serial
% touch index.txt

CA 使用这些文件来维护其证书文件数据库。

注意

index.txt 文件最初必须完全为空,甚至不能包含空格。

创建自签名 CA 证书和私钥

使用以下命令创建新的自签名 CA 证书和私钥:

openssl req -x509 -new -config X509CA/openssl.cnf -days 365 -out X509CA/ca/new_ca.pem -keyout X509CA/ca/new_ca_pk.pem

该命令提示您输入 CA 私钥的密码短语和 CA 可区分名称的详情。例如:

Using configuration from X509CA/openssl.cnf
Generating a 512 bit RSA private key
....++
.++
writing new private key to 'new_ca_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) []:Finance
Common Name (eg, YOUR name) []:Gordon Brown
Email Address []:gbrown@redhat.com
注意

CA 的安全性取决于私钥文件的安全性以及此步骤中使用的私钥密码短语。

您必须确保 CA 证书和私钥、new_ca.pemnew_ca_pk.pem 的文件名和位置与 openssl.cnf 中指定的值相同(请参阅前面的步骤)。

您现在已准备好使用您的 CA 签署证书。

2.5.3. 使用 CA 在 Java 密钥存储中创建签名证书

要执行的子步骤

要在 Java 密钥存储(JKS)中创建并签署证书,CertName.jks 可执行以下子步骤:

将 Java bin 目录添加到您的 PATH 中

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

Windows

> set PATH=JAVA_HOME\bin;%PATH%

UNIX

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

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

生成证书和私钥对

打开命令提示符,并将目录更改到存储密钥存储文件 KeystoreDir 的目录。使用以下命令:

keytool -genkey -dname "CN=Alice, OU=Engineering, O=Progress, ST=Co. Dublin, C=IE" -validity 365 -alias CertAlias -keypass CertPassword -keystore CertName.jks -storepass CertPassword

这个 keytool 命令通过 -genkey 选项调用,生成 X.509 证书和一个匹配的私钥。证书和密钥都放在新创建的密钥存储 CertName.jks 中的密钥条目中。由于指定的密钥存储( CertName.jks )在发出 命令之前不存在,因此 keytool 隐式创建新的密钥存储。

-dname-validity 标志定义新创建的 X.509 证书的内容,分别指定主题 DN 和之前的天数。有关 DN 格式的详情,请参考 附录 A, ASN.1 和可辨识名称

subject DN 的某些部分必须与 CA 证书中的值匹配(在 openssl.cnf 文件的 CA Policy 部分中指定)。默认的 openssl.cnf 文件需要以下条目匹配:

  • 国家/地区名称(C)
  • 州或省名称(ST)
  • 机构名称(O)
注意

如果您没有观察限制,OpenSSL CA 将拒绝为证书签名(请参阅 “为 CSR 签名”一节 )。

创建证书签名请求

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

keytool -certreq -alias CertAlias -file CertName_csr.pem -keypass CertPassword -keystore CertName.jks -storepass CertPassword

此命令将 CSR 导出至文件 CertName_csr.pem

为 CSR 签名

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

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

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

注意

如果要使用默认 CA 以外的 CA 证书对 CSR 签名,请使用 -cert-keyfile 选项分别指定 CA 证书及其私钥文件。

转换为 PEM 格式

将签名证书 CertName.pem 转换为 PEM 只格式,如下所示:

openssl x509 -in CertName.pem -out CertName.pem -outform PEM

连接文件

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

Windows

copy CertName.pem + X509CA\ca\new_ca.pem CertName.chain

UNIX

cat CertName.pem X509CA/ca/new_ca.pem> CertName.chain

使用完整证书链更新密钥存储

通过导入证书的完整证书链,更新密钥存储 . CertName.jks,如下所示:

keytool -import -file CertName.chain -keypass CertPassword -keystore CertName.jks -storepass CertPassword

根据需要重复步骤

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

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 设置。