基于OpenSSL签署根CA证书、二级CA证书(x-ca)

发布时间: 更新时间: 总字数:2737 阅读时间:6m 作者: IP上海 分享 网址
专栏文章
  1. 基于OpenSSL签署根CA证书、二级CA证书和SSL证书
  2. 基于OpenSSL签署根CA证书、二级CA证书(x-ca)(当前)
  3. 如何信任自签 CA 证书
  4. OpenSSL 文件数字签名

基于OpenSSL签署根CA、二级CA(包括 SSL CA/Email CA/Software CA)。

说明

  • 该文章翻译自 Advanced PKI
  • 因原文章记载的仓库使用的加密算法较旧等问题,本文做了以下拆分:

概述

我们假设一家名为 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 CARoot 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。

参考

  1. https://pki-tutorial.readthedocs.io/en/latest/advanced/index.html
  2. http://www.openssl.org/docs/apps/req.html
  3. http://www.openssl.org/docs/apps/ca.html
  4. http://www.openssl.org/docs/apps/x509.html
  5. http://www.openssl.org/docs/apps/crl.html
  6. http://www.openssl.org/docs/apps/crl2pkcs7.html
  7. http://www.openssl.org/docs/apps/pkcs7.html
  8. http://www.openssl.org/docs/apps/pkcs12.html
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数