多域名共用证书的核心是使用包含多个域名的 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. 确认证书覆盖范围
在配置之前,必须先确认你手中的证书文件是否真的包含了所有打算共用的域名。如果是单域名证书,强行配给其他域名会导致浏览器报“证书名称不匹配”错误。
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 -t
nginx -s reload验证方法
1. 浏览器访问
分别使用不同的域名通过 HTTPS 访问,查看地址栏锁形图标是否正常,点击查看详情确认证书信息无误且无红色警告。
2. 命令行验证
使用 openssl 命令模拟客户端握手,指定 -servername 参数来测试 SNI 是否生效以及证书是否匹配。
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
原文链接:https://www.zjcp.cc/ask/11738.html
