多域名单证书如何配置 Nginx 实现共用同一个 SSL 证书

文章导读
多域名共用证书的核心是使用包含多个域名的 SANs 证书或通配符证书,然后在 Nginx 不同 server 块中引用同一组证书文件。
📋 目录
  1. A 原理说明
  2. B 配置步骤
  3. C 验证方法
  4. D 注意事项
  5. E 参考来源
A A

多域名共用证书的核心是使用包含多个域名的 SANs 证书或通配符证书,然后在 Nginx 不同 server 块中引用同一组证书文件。

只要证书的主题备用名称(SANs)或通配符规则覆盖了所有域名,Nginx 配置层面可以直接复用同一组证书文件。

  • 适用场景:同一主体下的多个子域名或关联主域名
  • 前置条件:确认证书文件中已包含所有需要绑定的域名
  • 验收标准:通过 HTTPS 访问测试及 OpenSSL 命令验证域名匹配

原理说明

Nginx 处理 HTTPS 请求时,依赖 TLS 握手过程中的 SNI(Server Name Indication)扩展来识别客户端请求的具体域名。服务器接收到域名信息后,会查找配置中匹配的 server 块,并加载该块指定的证书。

如果多个 server 块指向同一个证书文件,且该证书的有效域名列表(Common Name 或 Subject Alternative Name)包含了这些 server 块中定义的 server_name,那么握手就能成功通过。这不需要特殊的 Nginx 模块支持,是标准的 TLS 行为。

配置步骤

1. 确认证书覆盖范围

在配置之前,必须先确认你手中的证书文件是否真的包含了所有打算共用的域名。如果是单域名证书,强行配给其他域名会导致浏览器报“证书名称不匹配”错误。

多域名单证书如何配置 Nginx 实现共用同一个 SSL 证书
openssl x509 -in /path/to/cert.crt -text -noout | grep DNS

检查输出中是否列出了所有需要配置的域名。

2. 编写 Nginx 配置

在不同的 server 块中,将 ssl_certificate 和 ssl_certificate_key 指向相同的路径。注意每个 server 块必须明确指定 server_name。同时建议在 80 端口配置强制跳转,确保 HTTP 请求自动切换到 HTTPS。

# HTTP 强制跳转至 HTTPS
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

# HTTPS 配置 - 域名 1
server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/nginx/ssl/multi_domain.crt;
    ssl_certificate_key /etc/nginx/ssl/multi_domain.key;
    # 其他配置...
}

# HTTPS 配置 - 域名 2
server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate /etc/nginx/ssl/multi_domain.crt;
    ssl_certificate_key /etc/nginx/ssl/multi_domain.key;
    # 其他配置...
}

3. 检查并重载

修改配置后,务必先测试语法,避免配置错误导致 Nginx 无法启动。

多域名单证书如何配置 Nginx 实现共用同一个 SSL 证书
nginx -t
nginx -s reload

验证方法

1. 浏览器访问

分别使用不同的域名通过 HTTPS 访问,查看地址栏锁形图标是否正常,点击查看详情确认证书信息无误且无红色警告。

2. 命令行验证

使用 openssl 命令模拟客户端握手,指定 -servername 参数来测试 SNI 是否生效以及证书是否匹配。

多域名单证书如何配置 Nginx 实现共用同一个 SSL 证书
openssl s_client -connect example.com:443 -servername example.com
openssl s_client -connect www.example.com:443 -servername www.example.com

观察输出中的 Verify return code 是否为 0,以及 Certificate chain 是否正确。

注意事项

1. 证书域名不匹配

这是最常见的问题。如果证书只包含 example.com,而配置了 blog.example.com,即使 Nginx 启动成功,客户端访问时也会报错。务必使用 SANs 证书或通配符证书。

2. 旧客户端兼容性

SNI 技术需要客户端支持。极少数非常古老的客户端(如 Windows XP 上的旧版 IE)不支持 SNI,可能导致握手失败。在现代互联网环境中通常可忽略。

参考来源

  • Nginx 官方文档,ngx_http_ssl_module,ssl_certificate 指令说明,URL: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate
  • OpenSSL 官方文档,x509 命令手册,URL: https://www.openssl.org/docs/man1.1.1/man1/x509.html