OpenSSL 自签名多 IP/多域名证书生成指南
本文档旨在指导如何使用 OpenSSL 生成一个支持 Subject Alternative Name (SAN) 的自签名 SSL 证书。该证书可同时被浏览器识别为对多个 IP 地址和域名有效,适用于内网开发、测试环境或混合部署场景。
1. 准备配置文件 (openssl.cnf)
首先,创建一个名为 openssl.cnf 的文件。此文件定义了证书的请求信息及扩展属性(SAN),这是让浏览器信任多个 IP 和域名的关键。
请复制以下内容并保存:
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no
[ req_distinguished_name ]
# 国家代码 (2位)
C = CN
# 省/州
ST = Beijing
# 城市
L = Beijing
# 公司/组织名称
O = MyCompany
# 部门名称
OU = MyOrg
# 通用名称 (通常填主 IP 或主域名,但在 SAN 模式下不作为唯一校验)
CN = 192.168.99.61
[ req_ext ]
subjectAltName = @alt_names
[ v3_req ]
subjectAltName = @alt_names
[ alt_names ]
# --- 在此处配置所有的 IP 地址 ---
IP.1 = 1.2.3.4
IP.2 = 5.6.7.8
IP.3 = 127.0.0.1
IP.4 = 0.0.0.0
# --- 在此处配置所有的域名 ---
# 注意:键名必须是 DNS.x
DNS.1 = localhost
DNS.2 = test.com
DNS.3 = *.example.com
⚙️ 配置说明 (自定义指南)
在 [ alt_names ] 部分,你可以自由添加任意数量的 IP 或域名。
- 添加 IP 地址:
使用IP.x = <IP地址>格式。- 示例:
IP.5 = 10.0.0.5
- 示例:
- 添加域名:
使用DNS.x = <域名>格式。- 普通域名:
DNS.1 = www.mysite.com - 泛域名:
DNS.2 = *.mysite.com(支持通配符) - 本地域名:
DNS.3 = localhost
- 普通域名:
注意:序号
x(如 IP.1, IP.2...) 必须递增且唯一,不可重复。
2. 生成证书与私钥
在 openssl.cnf 所在目录下,执行以下命令。该命令将生成有效期为 3650 天 (约10年) 的证书。
openssl req -x509 -nodes -days 3650 \
-newkey rsa:2048 \
-keyout server.key \
-out server.crt \
-config openssl.cnf \
-extensions "v3_req"
命令参数解析:
-x509: 生成自签名证书而不是证书签名请求 (CSR)。-nodes: 不加密私钥(启动服务器时无需输入密码)。-days 3650: 证书有效期天数。-newkey rsa:2048: 生成一个新的 2048 位 RSA 私钥。-config openssl.cnf: 指定使用我们在步骤 1 中创建的配置文件。-extensions "v3_req": 强制 OpenSSL 应用配置文件中定义的 v3 扩展(即 SAN 扩展)。
3. 输出文件说明
命令执行成功后,目录下会生成以下两个核心文件:
| 文件名 | 类型 | 说明 | 用途 |
|---|---|---|---|
| server.key | 私钥 | Private Key | 配置在 Nginx/Apache/Tomcat 中,严禁外泄。 |
| server.crt | 公钥证书 | Certificate | 配置在服务器中,并可分发给客户端安装信任。 |
4. 验证与使用
验证证书内容
你可以使用以下命令检查生成的证书是否包含了所有配置的 IP 和域名:
openssl x509 -in server.crt -text -noout | grep -A 1 "Subject Alternative Name"
预期输出应包含你配置的所有 IP Address 和 DNS。
部署效果
部署后,证书将同时支持以下形式的访问(端口不影响证书有效性):
https://1.2.3.4:20443https://5.6.7.8:20443https://test.com(需配合本地 hosts 或 DNS 解析)https://www.example.com(如果配置了泛域名)
⚠️ 关于浏览器信任
由于这是自签名证书,Chrome/Edge 等浏览器默认会提示“不安全”或“您的连接不是私密连接”。
- 解决方法:你需要将
server.crt导入到操作系统的“受信任的根证书颁发机构”中,或者在浏览器提示页面手动点击“高级 -> 继续访问”。
原创
自签名SSL证书生成
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
赞赏支持
如果觉得文章对你有帮助,可以请作者喝杯咖啡 ☕
评论交流
欢迎留下你的想法