2.5. 创建您自己的证书
2.5.1. 先决条件
openssl 工具程序
本节中描述的步骤基于 OpenSSL 项目中的 OpenSSL 命令行工具。有关 OpenSSL 命令行工具的其他文档,请参阅 http://www.openssl.org/docs/。
CA 目录结构示例
为了说明这一点,假设 CA 数据库具有以下目录结构:
|
|
|
|
其中 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 目录下,创建以下目录层次结构:
|
|
|
|
复制并编辑 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 证书和私钥
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 密钥存储中创建签名证书
要执行的子步骤
要在 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 签名
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
文件,如下所示:
将以下
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 的 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 签名
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
设置。