使用 OpenSSL 创建本地开发环境受信任的 HTTPS 证书

使用 OpenSSL 创建本地开发环境受信任的 HTTPS 证书

在本地开发中,我们经常需要使用 HTTPS 来模拟生产环境,尤其是当项目涉及 OAuth、Service Worker、安全 Cookie 等特性时。自签名证书虽然可用,但浏览器会显示安全警告,影响开发体验。本文将通过 OpenSSL 创建一个根 CA 证书,并签发包含多个域名的服务器证书,最后将根 CA 添加到系统信任存储中,实现无警告的本地 HTTPS 访问。

本文将支持以下两个域名:

  • localhost.host.test
  • develop.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

  1. 双击 ca.crt 文件。
  2. 点击"安装证书"。
  3. 选择"本地计算机",点击"下一步"。
  4. 选择"将所有证书都放入下列存储",点击"浏览",选择"受信任的根证书颁发机构",确定。
  5. 完成导入。

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.test
  • https://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 字段中添加即可。如果你需要更多的域名或通配符域名,可以在配置文件中按需添加。

希望这篇文章能帮助你快速搭建安全的本地开发环境。

相关推荐
rockingdingo16 分钟前
Codex Claude 智能体做3D/潮玩/IP设计——装上Craftsman Agent工匠智能体Skills 游泳男孩IP案例分享
网络协议·tcp/ip·3d
泡海椒44 分钟前
告别手写 HTTP 模板!JQuick-Curl:直接把 curl 命令跑在 Java 中
java·网络协议·http
AI备忘录2 小时前
(十六)GRE/IPSec 隧道配置命令五厂商对照:华为 华三 锐捷 迈普 思科
运维·服务器·网络·网络协议·网络安全·华为
牛马工作号3 小时前
大二层组网技术详解:VXLAN、GRETAP 等
网络·网络协议·安全·arp·大二层网络
pullyysusie6 小时前
展厅无线按钮触控点播音视频解决方案及应用
网络协议·音视频·集成学习·智能硬件
瓦格哈儿6 小时前
内网环境也需要证书?聊聊内网 IP 证书的适用边界
网络协议·ssl
A hao6 小时前
户外LED广告牌需要什么防护等级IP级别?
大数据·网络·图像处理·人工智能·网络协议·tcp/ip·广告
发光小北8 小时前
Bronze100 系列 自研PLC你用过吗?
网络协议
Patrick_Wilson10 小时前
RPC 与 REST 的本质区别看这一篇就够了:别再只看 URL 里有没有动词
http·rpc·restful
秋田君13 小时前
QT_HTTP协议编程
qt·http·iphone