生成一个 CA 证书,用这个 CA 证书来签发其他 SSL 证书。只需将 CA 证书添加到信任列表,由其签名的 SSL 证书也可以自动被信任。

1. 创建 CA 证书私钥

以下两种加密方式,任选一种。ECC 密钥更小,256位ECC密钥等效于3072位RSA密钥,384位ECC密钥等效于7680位RSA密钥。
RSA 私钥openssl genrsa -out ca.key 2048
ECC 私钥openssl ecparam -genkey -name secp384r1 -out ca.key
-name 参数指定椭圆曲线
openssl ecparam -list_curves 查看 openssl 支持的椭圆曲线

2. 生成 CA 证书

openssl req \
    -subj "/C=CN/ST=BJ/L=Beijing/O=Myself/OU=Myself Org/CN=Self-signed CA/[email protected]" \
    -new \
    -x509 \
    -days 3650 \
    -key ca.key \
    -out ca.crt

-subj里面的字段可以自定义。

3. 创建域名证书私钥

RSA 私钥openssl genrsa -out server.key 2048
ECC 私钥openssl ecparam -genkey -name secp384r1 -out server.key

4. 生成域名证书签名请求

证书签名请求 subj 中的 CN (Common Name) 必须区别于 CA 的证书里面的 CN (Common Name)

openssl req \
    -subj "/C=CN/ST=BJ/L=Beijing/O=Selfsigned Certificate/CN=Self-signed Certs for Dev" \
    -new \
    -key server.key \
    -out server.csr

5. 创建域名证书配置文件

创建一个cert.ext文件,输入以下内容。alt_names 可按需添加域名和 IP。

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.2 = 127.0.0.1
DNS.3 = *.localhost
DNS.4 = *.test.com

泛域名不生效,不知道为什么。 f10.png

6. 用 CA 证书签发域名证书

openssl x509 -days 3650 -req -sha256 -extfile cert.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt

把 ca.crt 导入本地计算机, 浏览器就会自动信任用它签发的其他证书。
server.crt 和 server.key 用来部署到 web 服务器。

7. 效果

Firefox 已经自动信任了。
how-does-it-work-on-browser.avif

证书详情。
certificate-detail.avif

参考链接:

文章目录