Nginx - 生成本地HTTPS自签名SSL证书

先看效果

在浏览器访问https://fake.server.com可以访问本地127.0.0.1的服务,并且浏览器不报不安全的提示

nginx_local_https

生成根证书 Root CA

1
2
3
4
5
# 生成 CA 私钥
openssl genrsa -out rootCA.key 2048

# 生成 CA 根证书(自签)(有效期 10 年)
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -subj "/CN=MyLocalRootCA" -out rootCA.crt

生成服务端证书

1
2
3
4
5
# 生成服务端私钥
openssl genrsa -out fake_server.key 2048

# 生成证书请求(CSR) 请注意 CN 必须和域名一致
openssl req -new -key fake_server.key -out fake_server.csr -subj "/CN=fake.server.com"

创建 SAN 配置文件

下面的命令直接拷贝进终端即可生成 SAN 配置文件。

1
2
3
4
5
6
7
8
9
10
11
cat > fake_server.ext <<EOF
[ v3_req ]
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = fake.server.com
EOF

extendedKeyUsage = serverAuth 非常关键,否则 Safari 不信任
subjectAltName 必须有你访问的域名

用 Root CA 签发 Server 证书(带 SAN)

1
openssl x509 -req -in fake_server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out fake_server.crt -days 3650 -sha256 -extfile fake_server.ext -extensions v3_req

配置 Nginx 使用生成的证书

将生成的 fake_server.crtrootCA.crt 合并成 fake_server_bundle.crtNginx 使用。

1
cat fake_server.crt rootCA.crt > fake_server_bundle.crt
1
2
3
4
5
server {
listen 443 ssl;
server_name fake.server.com;
ssl_certificate /path/to/your/nginx/certs/fake_server_bundle.crt;
ssl_certificate_key /path/to/your/nginx/certs/fake_server.key;

在 macOS 导入 rootCA.crt(注意不是 fake_server.crt)

1
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain rootCA.crt

也可以手动操作导入系统钥匙串(比登录钥匙串更可靠):
打开“钥匙串访问” → 选择系统钥匙串中的系统 → 导入 rootCA.crt → 设置为“始终信任” (证书名字是 MyLocalRootCA )。

在 /etc/hosts 添加以下内容

1
127.0.0.1 fake.server.com

重启 Nginx

退出浏览器并重新打开

这样浏览器会信任任何由这个 Root CA 签发的证书(包括你的 fake_server.crt)。