2.5. 创建您自己的证书
2.5.1. 先决条件
openssl 工具
本节中描述的步骤基于 OpenSSL 项目中的 OpenSSL 命令行工具。有关 OpenSSL 命令行工具的更多文档,请访问 http://www.openssl.org/docs/。
CA 目录结构示例
为了说明这一点,假设 CA 数据库具有以下目录结构:
|
|
|
|
其中 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 目录中,创建以下目录层次结构:
|
|
|
|
复制并编辑 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 目录中,初始化两个文件,即 serial
和 index.txt
。
Windows
要在 Windows 中初始化 串行
文件,请输入以下命令:
> echo 01 > serial
要创建空文件 index.txt
,在 Windows 中,在 X509CA 目录中的命令行中启动 Windows Notepad,如下所示:
> notepad index.txt
要响应带有文本的对话框,Cannot find the text.txt file。是否要创建新文件?
,点 并关闭 Notepad。
UNIX
要在 UNIX 中初始化 串行
文件和 index.txt
文件,请输入以下命令:
% echo "01" > serial % touch index.txt
CA 使用这些文件来维护其证书文件的数据库。
index.txt
文件最初必须完全为空,即使包含空格。
创建自签名 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.pem
和 new_ca_pk.pem
与 openssl.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 签名
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
文件:
将以下
req_extensions
设置添加到[req]
部分(如果openssl.cnf
文件中还没有存在):# openssl Configuration File ... [req] req_extensions=v3_req
添加
[v3_req]
部分标头(如果openssl.cnf
文件中不存在)。在[v3_req]
部分下,添加或修改subjectAltName
设置,将其设置为 DNS 主机名列表。例如,如果服务器主机支持替代 DNS 名称www.redhat.com
和jboss.org
,请设置subjectAltName
,如下所示:# openssl Configuration File ... [v3_req] subjectAltName=DNS:www.redhat.com,DNS:jboss.org
在适当的 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 签名
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
设置。