自己创建 CA,并用 CA 为各服务签发证书
· 阅读需 5 分钟
这篇文章是基于 常用 OpenSSL 命令 的一个补充,主要是介绍如何自己创建 CA,并用 CA 为各服务签发证书。
生成 CA 私钥
openssl ecparam -name prime256v1 -genkey -out ca.key
生成 CA 证书
为了让根证书的信息看起来漂亮一点,参考了一下几个有名的根证书,使用了Organization
、Organizational Unit
、Common Name
这几个字段。
就这几个字段生成一个配置文件,用这个配置文件生成CA的证书的信息会漂亮一点。
[ req ]
prompt = no
distinguished_name = req_distinguished_name
x509_extensions = v3_req
[ req_distinguished_name ]
OU = My Service, Inc.
O = My Service, Inc.
CN = My Service Root CA
[ v3_req ]
keyUsage = keyCertSign, cRLSign
basicConstraints = critical,CA:true
- 因为私钥是
ECDSA
算法生成 的,所以[req]
段下面的default_bits = 2048
就不起作用了,可以不写。 - keyUsage:keyUsage 扩展定义了证书的公钥可以用于哪些操作。对于根证书和中间CA证书,以下两个值通常是必须的:
- keyCertSign:证明证书的公钥可以用来签署其他证书。这是CA证书的关键功能,因为CA的主要作用就是签发证书。
- cRLSign:证明证书的公钥可以用来签署证书撤销列表(CRL)。CRL是由CA发布的列表,包含了被撤销(不再有效)的证书序列号。
- basicConstraints:basicConstraints 是一个关键扩展,它指示证书是否是CA证书以及是否有权签发其他证书。
- CA:true:指示证书是CA证书,并且可以用来签发其他证书。
- critical:这个关键字表示这个扩展是“关键的”,意味着如果证书使用者或者验证证书链的软件不能理解这个扩展,那么应该拒绝这个证书。对于 basicConstraints,这是非常重要的,因为它定义了证书的基本信任结构。
然后用这个配置文件生成CA证书。
openssl req -new -x509 -key ca.key -out ca.crt -days 3650 -nodes -sha256 -config ca.conf
-nodes
:不加密私钥-sha256
:使用 SHA256 来生成公钥的哈希值(摘要)
生成服务私钥
openssl ecparam -name prime256v1 -genkey -out server.key
生成服务证书请求(CSR)
openssl req -new -key server.key -out server.csr
如果你使用 SAN(Subject Alternative Name)来给多个域名签发证书,请参考 https://notes.junorz.com/docs/others/cheatsheet/openssl#sansubject-alternative-name 来生成 SAN 配置文件。
然后在生成CSR的时候加上 -config
选项。
openssl req -new -key server.key -out server.csr -config san.cnf
用自己的 CA 为服务签发证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256
如果你使用 SAN(Subject Alternative Name)来给多个域名签发证书,请参考 https://notes.junorz.com/docs/others/cheatsheet/openssl#sansubject-alternative-name 来生成 SAN 配置文件。
然后在签发证书的时候加上 -extfile
和 -extensions
选项。
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256 -extfile san.cnf -extensions req_ext
-CAcreateserial
:选项指示 OpenSSL 在签署生成 server.crt 证书的过程中,如果需要,创建一个新的序列号文件。这确保了每个签署的证书都有一个独特的序列号,从而维护了证书系统的完整性。