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. 设置您自己的 CA

要执行的子步骤

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

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

将 bin 目录添加到 PATH 中

在安全 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.cnf 从您的 OpenSSL 安装复制到 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 目录中,初始化两个文件,即 serialindex.txt

Windows

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

> echo 01 > serial

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

> notepad index.txt

要响应带有文本的对话框,Cannot find the text.txt file。是否要创建新文件?,点 Yes 并关闭 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.pemopenssl.cnf 中指定的值相同(请参阅前面的步骤)。

现在,您可以使用您的 CA 签署证书。

2.5.3. 使用 CA 在 Java Keystore 中创建签名证书

要执行的子步骤

要在 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 和可辨识名称

主题 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 节 “设置您自己的 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 PKCScriu 证书

要执行的子步骤

如果您设置了私有 CA,如 第 2.5.2 节 “设置您自己的 CA” 所述,您现在可以创建并签署您自己的证书。

要创建并签署 PKCScriu 格式 CertName.p12 的证书,请执行以下子步骤:

将 bin 目录添加到 PATH 中

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

Windows

> set PATH=OpenSSLDir\bin;%PATH%

UNIX

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

此步骤使 openssl 工具可用。

配置 subjectAltName 扩展(可选)

执行此步骤,如果证书面向客户端强制执行 URL 完整性检查的 HTTPS 服务器,如果您计划将服务器部署到多主目录主机或具有多个 DNS 名称别名的主机(例如,如果您要在多重 Web 服务器上部署证书)。在这种情况下,证书身份必须与多个主机名匹配,且只能通过添加 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 的通用名称是通常用于表示证书所有者的身份的字段。通用名称必须满足以下条件:

  • 通用名称对于 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 节 “设置您自己的 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

创建 PKCScriu 文件

CertName_list.pem 文件创建一个 PKCScriu 文件,如下所示:

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

会提示您输入一个密码来加密 PKCScriu 证书。通常,此密码与 CSR 密码相同(这是许多证书存储库要求)。

根据需要重复步骤

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

(可选)清除 subjectAltName 扩展

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

openssl.cnf 文件中,注释掉 subjectAltName 设置(在行的开头添加一个 # 字符),同时注释掉 copy_extensions 设置。