Nginx配置多域名SSL证书本质是利用SNI技术实现单IP多HTTPS站点;需确保OpenSSL≥1.0.2且非BoringSSL,各server块独立配置server_name与专属证书路径,禁用证书共用,并通过openssl s_client验证SNI生效。

在 Nginx 中配置多域名 SSL 证书,本质是利用 SNI(Server Name Indication)技术实现单 IP 多 HTTPS 站点。Nginx 本身不需额外开启 SNI,只要底层 OpenSSL 支持(1.0.2+ 或 1.1.1+),且配置结构正确,就能自动按域名分发对应证书。
确保运行环境支持 SNI
这是最容易被忽略的前提:
- 运行 nginx -V 2>&1 | grep -i openssl,确认输出包含类似 OpenSSL 1.1.1w 的版本号;若显示 BoringSSL 或无输出,说明不支持 SNI,需更换官方预编译包或重编译
- Nginx 版本建议 ≥1.11.0(主流发行版默认满足),且编译时启用了 --with-http_ssl_module
- 无需手动添加
ssl_protocols或ssl_ciphers来“启用”SNI,它在 TLS 握手层自动生效
为每个域名准备独立证书文件
不能混用、不能共用路径,必须一一对应:
- 推荐用 certbot 分开申请:
certbot --nginx -d site-a.comcertbot --nginx -d site-b.net这样会在/etc/letsencrypt/live/下生成隔离的目录 - 每个域名的证书路径应明确指向其 own
fullchain.pem和privkey.pem,例如:ssl_certificate /etc/letsencrypt/live/site-a.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/site-a.com/privkey.pem; - 不要把多个域名的 leaf 证书塞进同一个 PEM 文件——这不是合并,而是错误,会导致握手失败或浏览器报错
编写独立的 server 块并精确匹配
每个域名一个 server,监听 443,靠 server_name 和证书路径双重绑定:
- 每个块必须写
listen 443 ssl http2;(http2可选但推荐) -
server_name要与证书 SAN 或 CN 完全一致,如证书含www.site-a.com和site-a.com,就写:server_name site-a.com www.site-a.com; - 禁止多个
server块共用同一组ssl_certificate路径——Nginx 不报错,但只加载第一个块的证书,其余全部 fallback - 可为 HTTP 添加跳转:
server { listen 80; server_name site-a.com; return 301 https://$host$request_uri; }
验证与兜底处理
上线前务必实测,尤其关注边缘情况:
- 用 OpenSSL 直接验证 SNI 是否生效:
openssl s_client -connect your.ip:443 -servername site-a.com -showcerts 2>/dev/null | openssl x509 -noout -subject
应返回site-a.com的主体;换域名再试,应返回另一张证书 - 对不发 SNI 的老旧客户端(如某些 IoT 设备),Nginx 默认使用第一个定义的
server块响应;如需控制,可显式设:listen 443 ssl http2 default_server;并配一张兜底证书 - 每次改完配置,先
nginx -t检查语法,再nginx -s reload生效


















