为什么?

受信任的 CA 通常被操作系统或类库内置,以进行 TLS 握手时的有效 CA 验证。

自签 CA 可用于测试等用途,若其使用现代方式生成,且私钥不被泄露,它的安全性将与受信任的 CA 相当。

创建 CA

在开始前,你需要确保 OpenSSL 已被正确安装。

创建 CA 的私钥

openssl genrsa -des3 -out cakey.key 2048Code language: CSS (css)
  • -des3 使用 des3 加密算法
  • -out 指定输出路径
  • 2048 指定生成 2048 位的 RSA 密钥对(位数越高安全性越好,但以性能为代价

这将为你生成 cakey.key 文件,在过程中可能提示输入密码以加密私钥,不推荐跳过该步骤。

在生成完毕后,请妥善保管该私钥,勿将其泄露。

创建 CA 的证书

通常被实际用来签发证书的 CA 被另一顶级 CA 签发(根 CA),这被称为证书链

为简单化,我们在此创建的 CA 证书将作为根 CA 使用,不需进行额外嵌套。

openssl req -x509 -new -nodes -key cakey.key -sha256 -days 365 -out cacert.pemCode language: CSS (css)
  • -new 创建新的证书请求
  • -x509 输出自签证书而不是证书请求
  • -nodes 不加密
  • -key 指定私钥路径
  • -sha256 使用sha256哈希算法
  • -days 指定证书有效天数
  • -out 指定输出路径

创建证书私钥

openssl genrsa -out server.key 2048Code language: CSS (css)

一些参数的作用在先前已描述,将不再阐述。

创建证书 CSR

openssl req -new -key server.key -out server.csrCode language: CSS (css)

注意,使用此步骤生成的 CSR 将不携带 SAN (Subject Alternative name)。

创建带 SAN 的证书 CSR

SAN (Subject Alternative name) 用于设置证书的额外公有名,它可以是域名,甚至是IP地址。

创建带参数的 OpenSSL 配置文件

以下为配置文件示例,请根据需求自行更改。

[req]
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no

[req_distinguished_name]
C = C
ST = ST
L = L
O = O
OU = OU
CN = CN

[req_ext]
subjectAltName = @alt_names

[alt_names]
IP.1 = 10.10.10.10
IP.2 = 10.10.10.11
DNS.1 = www.example.com
DNS.2 = example.com

将文件保存为 server_cert.cnf 后执行下一步操作。

创建 CSR

openssl req -new -key server.key -out server.csr -config server_cert.cnfCode language: CSS (css)

由于我们在配置文件定义 prompt=no,也提供了 CSR 的对应信息,所以执行该命令不会输出任何内容,但生成了 CSR 文件。

签发证书

现在,我们有了自己的 CA 私钥及证书,还有对应的 CSR 申请文件,可以开始进行签发了!

带 SAN 的签发

openssl x509 -req -days 365 -in server.csr -CA cacert.pem -CAkey cakey.key -CAcreateserial -out server.crt -extensions req_ext -extfile server_cert.cnf
Code language: CSS (css)
  • -CA 指定CA证书文件路径。
  • -CAkey 指定CA证书私钥路径。
  • -CAcreateserial  为签发证书分配 01 序列码(在后续签发同证书需替换为 -CAserial 参数,参阅)。
  • -extensions 使用指定扩展
  • -extfile 指定额外文件路径

不带 SAN 的签发

openssl x509 -req -days 365 -in server.csr -CA cacert.pem -CAkey cakey.key -CAcreateserial -out server.crt
Code language: CSS (css)

额外的调试

在过程中可能出现问题,以下将额外提供一些方便的命令行以方便进行调试。

验证 CSR 信息

openssl req -noout -text -in server.csrCode language: CSS (css)
  • -noout 不输出文件
  • -text 输出文字信息

验证证书信息

openssl x509 -noout -text -in server.crtCode language: CSS (css)

大功告成

通过上述操作,你应生成以下文件。

  • cakey.key CA 密钥
  • cacert.pem CA 证书
  • server.key 签发证书密钥
  • server.csr 签发证书的证书签发请求
  • server.crt 签发证书

注意,请妥善保存私钥,以防数据泄露及可能的中间人攻击。

在使用签发的证书前,你需要使系统或程序信任使用上述步骤创建的 CA,否则,TLS 握手将因无法在受信任的 CA 中找到该 CA 而不能正常工作。

References

分类: OPENSSL

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据