基于OpenSSL签署根CA、二级CA(包括 SSL CA/Email CA/Software CA)。
说明
概述
我们假设一家名为 X CA
的公司控制着域名 xiexianbin.cn
。该公司运行 Root CA 以满足其安全需求如下:
要实施上述 CAs,我们首先创建 Root CA
及其 CA 证书。然后,我们使用 Root CA
创建三个签名 CA:
- X Email CA
- X TLS CA
- X Software CA
上述CA签发完成后,分别以 TLS 身份验证
、电子邮件保护
和 代码签名
三种使用场景签发用户证书。
本文的所有命令都可以复制/粘贴到终端中。当您到达本页末尾时,您将构建一个具有多个签名 CA 的 PKI,并签发了 4 种不同类型的用户证书。
首先,获取示例文件并切换到新目录:
git clone https://github.com/xiexianbin/x-ca.git
cd x-ca
配置文件
每个 CA 使用一个配置文件:
每个 CSR 类型一个配置文件:
请在继续之前完成配置文件的修改。
1. 创建Root CA
1.1 创建目录
mkdir -p ca/root-ca/private ca/root-ca/db crl certs
chmod 700 ca/root-ca/private
ca
目录存放 CA 资源
crl
目录存放 CRL
certs
目录存放用户证书
1.2 创建数据库
cp /dev/null ca/root-ca/db/root-ca.db
cp /dev/null ca/root-ca/db/root-ca.db.attr
echo 01 > ca/root-ca/db/root-ca.crt.srl
echo 01 > ca/root-ca/db/root-ca.crl.srl
文件必须存在才能使用 openssl ca
命令。
1.3 创建CA请求
openssl req -new \
-config etc/root-ca.conf \
-out ca/root-ca.csr \
-keyout ca/root-ca/private/root-ca.key
使用 openssl req -new
命令,我们为 Root CA
创建私钥和 CSR。配置取自 Root CA 配置文件 的 [req] 部分。
1.4 创建CA证书
openssl ca -selfsign \
-config etc/root-ca.conf \
-in ca/root-ca.csr \
-out ca/root-ca.crt \
-extensions root_ca_ext \
-enddate 20601231235959Z
使用 openssl ca
命令,我们从 CSR 创建自签名根证书。配置取自 Root CA 配置文件的 [ca] 部分。请注意,我们根据密钥长度指定结束日期。 2048 位 RSA 密钥在 2060 年之前被认为是安全的(RSA 实验室)。
1.5 创建初始 CRL
openssl ca -gencrl \
-config etc/root-ca.conf \
-out crl/root-ca.crl
使用 openssl ca -gencrl
命令,我们生成一个初始(空)CRL。
2. 创建 TLS CA
2.1 创建目录
mkdir -p ca/tls-ca/private ca/tls-ca/db crl certs
chmod 700 ca/tls-ca/private
2.2 创建数据库
cp /dev/null ca/tls-ca/db/tls-ca.db
cp /dev/null ca/tls-ca/db/tls-ca.db.attr
echo 01 > ca/tls-ca/db/tls-ca.crt.srl
echo 01 > ca/tls-ca/db/tls-ca.crl.srl
2.3 创建CA请求
openssl req -new \
-config etc/tls-ca.conf \
-out ca/tls-ca.csr \
-keyout ca/tls-ca/private/tls-ca.key
我们为 TLS CA 创建私钥和 CSR。该配置取自 TLS CA 配置文件 的 [req] 部分。
2.4 创建CA证书
openssl ca \
-config etc/root-ca.conf \
-in ca/tls-ca.csr \
-out ca/tls-ca.crt \
-extensions signing_ca_ext
我们使用 Root CA
来签发 TLS CA 证书。
2.5 创建初始 CRL
openssl ca -gencrl \
-config etc/tls-ca.conf \
-out crl/tls-ca.crl
我们创建一个空的 CRL。
2.6 创建 PEM 包
cat ca/tls-ca.crt ca/root-ca.crt > \
ca/tls-ca-chain.pem
我们创建一个证书链文件。
3. 创建 Email CA
3.1 创建目录
mkdir -p ca/email-ca/private ca/email-ca/db crl certs
chmod 700 ca/email-ca/private
3.2 创建数据库
cp /dev/null ca/email-ca/db/email-ca.db
cp /dev/null ca/email-ca/db/email-ca.db.attr
echo 01 > ca/email-ca/db/email-ca.crt.srl
echo 01 > ca/email-ca/db/email-ca.crl.srl
3.3 创建CA请求
openssl req -new \
-config etc/email-ca.conf \
-out ca/email-ca.csr \
-keyout ca/email-ca/private/email-ca.key
我们为 Email CA
创建一个私钥和一个 CSR。该配置取自 Email CA 配置文件 的 [req] 部分。
3.4 创建CA证书
openssl ca \
-config etc/root-ca.conf \
-in ca/email-ca.csr \
-out ca/email-ca.crt \
-extensions signing_ca_ext
我们使用 Root CA
来签发 Email CA
证书。注意 -extensions
可以省略。
3.5 创建初始 CRL
openssl ca -gencrl \
-config etc/email-ca.conf \
-out crl/email-ca.crl
我们创建一个初始的空 CRL。
3.6 创建 PEM 包
cat ca/email-ca.crt ca/root-ca.crt > \
ca/email-ca-chain.pem
我们从 Email CA
和 Root CA
证书创建证书链文件。稍后它将作为 openssl pkcs12
命令的输入方便地使用。
4. 创建 Software CA
4.1 创建目录
mkdir -p ca/software-ca/private ca/software-ca/db crl certs
chmod 700 ca/software-ca/private
4.2 创建数据库
cp /dev/null ca/software-ca/db/software-ca.db
cp /dev/null ca/software-ca/db/software-ca.db.attr
echo 01 > ca/software-ca/db/software-ca.crt.srl
echo 01 > ca/software-ca/db/software-ca.crl.srl
4.3 创建CA请求
openssl req -new \
-config etc/software-ca.conf \
-out ca/software-ca.csr \
-keyout ca/software-ca/private/software-ca.key
我们为 Software CA
创建一个私钥和一个 CSR。该配置取自 Software CA 配置文件 的 [req] 部分。
4.4 创建CA证书
openssl ca \
-config etc/root-ca.conf \
-in ca/software-ca.csr \
-out ca/software-ca.crt \
-extensions signing_ca_ext
我们使用 Root CA
来签发 Software CA
证书。
4.5 创建初始 CRL
openssl ca -gencrl \
-config etc/software-ca.conf \
-out crl/software-ca.crl
我们创建一个空的 CRL。
4.6 创建 PEM 包
cat ca/software-ca.crt ca/root-ca.crt > \
ca/software-ca-chain.pem
我们创建一个证书链文件。
5. 签发 TLS 服务器证书
5.1 创建TLS服务器请求
SAN=DNS:xiexianbin.cn,DNS:www.xiexianbin.cn \
openssl req -new \
-config etc/server.conf \
-out certs/xiexianbin.cn.csr \
-keyout certs/xiexianbin.cn.key
我们使用适当的请求配置文件为 TLS 服务器证书创建私钥和 CSR。出现提示时,输入这些 DN 组件:C=CN、O=X CA、CN=www.xiexianbin.cn
。无法提示输入 subjectAltName
,必须将其指定为环境变量。
5.2 创建TLS服务器证书
openssl ca \
-config etc/tls-ca.conf \
-in certs/xiexianbin.cn.csr \
-out certs/xiexianbin.cn.crt \
-extensions server_ext
我们使用 TLS CA 来签发服务器证书。
5.3 创建 PKCS#12 包
openssl pkcs12 -export \
-name "xiexianbin.cn (Network Component)" \
-caname "X TLS CA 1C1" \
-caname "X Root CA - R1" \
-inkey certs/xiexianbin.cn.key \
-in certs/xiexianbin.cn.crt \
-certfile ca/tls-ca-chain.pem \
-out certs/xiexianbin.cn.p12
我们将私钥、证书和 CA 链打包到一个 PKCS#12 包中以进行分发。
5.4 创建 TLS 客户端请求
openssl req -new \
-config etc/client.conf \
-out certs/barney.csr \
-keyout certs/barney.key
我们使用客户端请求配置文件为 TLS 客户端证书创建私钥和 CSR。当提示输入这些 DN 组件时:C=CN、O=Telenor AS、OU=Support、CN=Barney Rubble、emailAddress=barney@xiexianbin.cn
。
5.5 创建 TLS 客户端证书
openssl ca \
-config etc/tls-ca.conf \
-in certs/barney.csr \
-out certs/barney.crt \
-policy extern_pol \
-extensions client_ext
我们使用 TLS CA 来签发 Barney 的客户端证书。请注意,我们必须指定 extern 的命名策略,因为 DN 不会满足默认匹配的策略。
5.6 创建 PKCS#12 包
openssl pkcs12 -export \
-name "Barney Rubble (Network Access)" \
-caname "X TLS CA 1C1" \
-caname "X Root CA - R1" \
-inkey certs/barney.key \
-in certs/barney.crt \
-certfile ca/tls-ca-chain.pem \
-out certs/barney.p12
我们将所有内容打包成一个 PKCS#12 包进行分发。
5.7 吊销证书
openssl ca \
-config etc/tls-ca.conf \
-revoke ca/tls-ca/pem \
-crl_reason affiliationChanged
支持合同结束后,我们将吊销证书。
5.8 创建 CRL
openssl ca -gencrl \
-config etc/tls-ca.conf \
-out crl/tls-ca.crl
下一个 CRL 包含已撤销的证书。
6. 签发 Email 证书
6.1 创建电子邮件请求
openssl req -new \
-config etc/email.conf \
-out certs/xianbin.csr \
-keyout certs/xianbin.key
我们使用请求配置文件为电子邮件保护证书创建私钥和 CSR。当提示输入这些 DN 组件时:C=CN、O=X CA、CN=xianbin、emailAddress=xianbin@xiexianbin.cn
。将其他字段留空。
6.2 创建电子邮件证书
openssl ca \
-config etc/email-ca.conf \
-in certs/xianbin.csr \
-out certs/xianbin.crt \
-extensions email_ext
我们使用 Email CA
来签发 xianbin 的电子邮件保护证书。证书的副本以ca/email-ca/01.pem
的名称保存在证书存档中(01 是十六进制的证书序列号。)
6.3 创建 PKCS#12 包
openssl pkcs12 -export \
-name "xianbin (Email Security)" \
-caname "X Email CA" \
-caname "X Root CA - R1" \
-inkey certs/xianbin.key \
-in certs/xianbin.crt \
-certfile ca/email-ca-chain.pem \
-out certs/xianbin.p12
我们将私钥、证书和 CA 链打包到一个 PKCS#12 包中。这种格式(通常带有 .pfx 扩展名)用于向最终用户分发密钥和证书。友好名称有助于识别捆绑包中的各个证书。
6.4 吊销证书
openssl ca \
-config etc/email-ca.conf \
-revoke ca/email-ca/pem \
-crl_reason keyCompromise
当 xianbin 的笔记本电脑丢失时,我们吊销了他的证书。
6.5 创建 CRL
openssl ca -gencrl \
-config etc/email-ca.conf \
-out crl/email-ca.crl
下一个 CRL 包含已撤销的证书。
7. 签发 Software 证书
7.1 创建代码签名请求
openssl req -new \
-config etc/codesign.conf \
-out certs/software.csr \
-keyout certs/software.key
我们使用另一个请求配置文件为代码签名证书创建私钥和 CSR。当提示输入这些 DN 组件时:C=CN、O=X CA、OU=www.xiexianbin.cn、CN=X Root CA - R1
。
7.2 创建代码签名证书
openssl ca \
-config etc/software-ca.conf \
-in certs/software.csr \
-out certs/software.crt \
-extensions codesign_ext
我们使用 Software CA
来签发代码签名证书。
7.3 创建 PKCS#12 包
openssl pkcs12 -export \
-name "X Software Certificate" \
-caname "X Software CA" \
-caname "X Root CA - R1" \
-inkey certs/software.key \
-in certs/software.crt \
-certfile ca/software-ca-chain.pem \
-out certs/software.p12
我们为分发创建了一个 PKCS#12 包。
7.4 吊销证书
openssl ca \
-config etc/software-ca.conf \
-revoke ca/software-ca/pem \
-crl_reason unspecified
为了完成示例,我们吊销了软件证书。
7.5 创建 CRL
openssl ca -gencrl \
-config etc/software-ca.conf \
-out crl/software-ca.crl
下一个 CRL 包含已撤销的证书。
8. 发布证书
8.1 创建DER证书
openssl x509 \
-in ca/root-ca.crt \
-out ca/root-ca.cer \
-outform der
openssl x509 \
-in ca/tls-ca.crt \
-out ca/tls-ca.cer \
-outform der
所有已发布的证书必须采用 DER 格式。 MIME 类型:应用程序/pkix 证书。
8.2 创建 DER CRL
openssl crl \
-in crl/email-ca.crl \
-out crl/email-ca.crl \
-outform der
所有已发布的 CRL 必须采用 DER 格式。 MIME 类型:应用程序/pkix-crl。
8.3 创建 PKCS#7 包
openssl crl2pkcs7 -nocrl \
-certfile ca/email-ca-chain.pem \
-out ca/email-ca-chain.p7c \
-outform der
PKCS#7 用于捆绑两个或多个证书。 MIME 类型:应用程序/pkcs7-mime。