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

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

相关推荐
mudtools7 分钟前
HttpUtils:一个编译时生成的声明式 HTTP 客户端框架
网络·网络协议·http·.net
卖萌的斜阳14 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
单片机·网络协议·tcp/ip
用户83344239661415 小时前
Qt6 实现 TCP/UDP/组播 透明中继抓包工具 | 流量录制回放 | 工业设备调试
网络协议
CryptoPP17 小时前
BSE股票K线数据接入实战:从接口调用到前端图表展示
大数据·前端·网络·人工智能·websocket·网络协议
ITxiaobing202317 小时前
程序化广告RTB场景下IP地理定位服务的精度与工程架构选型
网络协议·tcp/ip·架构
阿米亚波20 小时前
【EVE-NG 实战】防火墙基础(VLAN · VRRP · NAT · ACL · 静态路由)
运维·网络·笔记·网络协议·计算机网络·网络安全·运维开发
tiantianuser20 小时前
NVME-oF IP 设计2 :设计之前的调研!
网络·网络协议·rdma·roce v2·nvme of
用户1257585243621 小时前
Go 里读取 request body 后,下游拿不到参数:别让日志中间件把请求吃掉
http·go·测试
2401_873479401 天前
如何识别代理IP和伪装流量?用IP情报工具三步穿透住宅代理伪装
网络·数据库·网络协议·tcp/ip·ip
STDD1 天前
Traefik 中间件深度配置:限流、认证、IP 白名单与错误页面定制
网络协议·tcp/ip·中间件