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

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

相关推荐
Monkey-旭2 小时前
Java HTTP证书全用法详解:原理、配置、实战与问题排查
java·开发语言·http·证书·ssl
@insist1234 小时前
软件设计师-网络层核心知识全解:广域网协议、TCP/IP 体系与 IP 地址规划
网络·网络协议·tcp/ip·软考·软件设计师·软件水平考试
平生幻13 小时前
TCP协议与UDP协议的区别
网络协议·tcp/ip·udp
虾..15 小时前
UDP协议
网络·网络协议·udp
Java成神之路-20 小时前
DNS 与 CDN 底层原理深度剖析:从域名解析到内容分发全链路解析
网络·网络协议·tcp/ip
Predestination王瀞潞1 天前
5.4.3 通信->WWW万维网内容访问标准(W3C):WWW(World Wide Web) 协议架构(分层)
前端·网络·网络协议·架构·www
huohaiyu1 天前
HTTPS的加密流程
网络协议·http·https
德迅云安全杨德俊1 天前
直面 DDoS 威胁:从现状到解决方案
网络·安全·web安全·https·ddos
花月C1 天前
基于WebSocket的 “聊天” 业务设计与实战指南
java·网络·后端·websocket·网络协议