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 AddressDNS

部署效果

部署后,证书将同时支持以下形式的访问(端口不影响证书有效性):

  • https://1.2.3.4:20443
  • https://5.6.7.8:20443
  • https://test.com (需配合本地 hosts 或 DNS 解析)
  • https://www.example.com (如果配置了泛域名)

⚠️ 关于浏览器信任

由于这是自签名证书,Chrome/Edge 等浏览器默认会提示“不安全”或“您的连接不是私密连接”。

  • 解决方法:你需要将 server.crt 导入到操作系统的“受信任的根证书颁发机构”中,或者在浏览器提示页面手动点击“高级 -> 继续访问”。