使用 OpenSSL 创建本地开发环境受信任的 HTTPS 证书
在本地开发中,我们经常需要使用 HTTPS 来模拟生产环境,尤其是当项目涉及 OAuth、Service Worker、安全 Cookie 等特性时。自签名证书虽然可用,但浏览器会显示安全警告,影响开发体验。本文将通过 OpenSSL 创建一个根 CA 证书,并签发包含多个域名的服务器证书,最后将根 CA 添加到系统信任存储中,实现无警告的本地 HTTPS 访问。
本文将支持以下两个域名:
localhost.host.testdevelop.host.test
准备工作
首先创建一个工作目录,存放所有证书文件:
bash
mkdir ~/certs && cd ~/certs
第一步:创建根 CA 证书
根证书用于签署服务器证书,我们只需将根证书添加到系统信任列表,后续由它签发的所有证书都会被浏览器信任。
1. 生成根 CA 私钥
bash
openssl genrsa -out ca.key 2048
2. 生成根 CA 证书(自签名,有效期 10 年)
bash
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=DevCA/CN=Dev Root CA"
参数说明:
-x509:输出自签名证书-new:生成新证书请求-nodes:私钥不加密(无密码)-days 3650:有效期 10 年-subj:证书主题信息,可根据实际情况修改
第二步:创建服务器证书
1. 生成服务器私钥
bash
openssl genrsa -out server.key 2048
2. 创建证书签名请求(CSR)配置文件
创建一个 server.conf 文件,内容如下:
ini
[req]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no
[req_distinguished_name]
C = CN
ST = Beijing
L = Beijing
O = Dev
CN = localhost.host.test
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost.host.test
DNS.2 = develop.host.test
这里 subjectAltName 扩展声明了证书支持的两个域名,浏览器会优先检查该字段。
3. 生成 CSR
bash
openssl req -new -key server.key -out server.csr -config server.conf
4. 创建用于签名的扩展配置文件
创建一个 v3.ext 文件,用于最终证书的扩展属性:
ini
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost.host.test
DNS.2 = develop.host.test
5. 使用根 CA 签名服务器证书
bash
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 365 -sha256 -extfile v3.ext
执行后得到:
server.crt-- 服务器证书server.key-- 服务器私钥
第三步:将根 CA 添加到受信任的根证书存储
根据操作系统不同,导入根证书的方法略有差异。
macOS
bash
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ca.crt
Windows
- 双击
ca.crt文件。 - 点击"安装证书"。
- 选择"本地计算机",点击"下一步"。
- 选择"将所有证书都放入下列存储",点击"浏览",选择"受信任的根证书颁发机构",确定。
- 完成导入。
Linux (Ubuntu/Debian)
bash
sudo cp ca.crt /usr/local/share/ca-certificates/dev-ca.crt
sudo update-ca-certificates
浏览器注意事项
- Chrome / Edge 使用系统信任存储,导入系统后自动生效。
- Firefox 使用自己的证书存储,需要单独导入:
打开 Firefox → 设置 → 隐私与安全 → 证书 → 查看证书 → 导入 → 选择ca.crt,并勾选"信任该证书以标识网站"。
第四步:配置 Web 服务器
以 Nginx 为例,在站点配置中添加 SSL 相关设置:
nginx
server {
listen 443 ssl;
server_name localhost.host.test develop.host.test;
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;
# 其他配置...
}
如果使用其他服务器(如 Apache、Caddy 等),请参照其文档配置证书路径。
为了使域名解析到本地,还需修改 /etc/hosts 文件:
127.0.0.1 localhost.host.test develop.host.test
第五步:验证
重启 Web 服务器后,在浏览器中访问:
https://localhost.host.testhttps://develop.host.test
浏览器地址栏应显示安全锁图标,无证书警告。
附:完整命令汇总
bash
# 1. 创建根 CA
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=DevCA/CN=Dev Root CA"
# 2. 创建服务器证书
openssl genrsa -out server.key 2048
# 创建 server.conf(见上文内容)
# 创建 v3.ext(见上文内容)
openssl req -new -key server.key -out server.csr -config server.conf
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256 -extfile v3.ext
总结
通过自建根 CA 并签发证书,我们可以轻松获得多个域名的受信任 HTTPS 证书,极大地方便了本地开发。此方法可扩展至任意域名,只需在 SAN 字段中添加即可。如果你需要更多的域名或通配符域名,可以在配置文件中按需添加。
希望这篇文章能帮助你快速搭建安全的本地开发环境。