跳到主要内容

自己创建 CA,并用 CA 为各服务签发证书

· 阅读需 5 分钟

这篇文章是基于 常用 OpenSSL 命令 的一个补充,主要是介绍如何自己创建 CA,并用 CA 为各服务签发证书。

生成 CA 私钥

openssl ecparam -name prime256v1 -genkey -out ca.key

生成 CA 证书

为了让根证书的信息看起来漂亮一点,参考了一下几个有名的根证书,使用了OrganizationOrganizational UnitCommon 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 证书的过程中,如果需要,创建一个新的序列号文件。这确保了每个签署的证书都有一个独特的序列号,从而维护了证书系统的完整性。

注意

从2020年9月1日起,苹果(Apple)和谷歌(Google)等公司决定不再信任有效期超过398天(大约13个月)的新SSL/TLS证书。这意味着,如果一个证书的有效期超过这个限制,就会触发NET::ERR_CERT_VALIDITY_TOO_LONG的错误。