Nginx支持单IP单443端口多域名多SSL证书,依赖SNI技术;需OpenSSL≥1.0.1、启用--with-http_ssl_module,每个域名配独立server块并指定专属证书路径,用openssl s_client验证证书匹配。

Nginx 支持在同一台服务器、同一个 IP 和 443 端口上,为多个域名分别使用不同的 SSL 证书——前提是启用 TLS SNI(Server Name Indication)并正确配置。
核心逻辑很简单:每个域名对应一个独立的 server 块,各自声明 listen 443 ssl、server_name、ssl_certificate 和 ssl_certificate_key。
只要 Nginx 编译时启用了 --with-http_ssl_module,且底层 OpenSSL 版本 ≥1.0.1(现代系统基本都满足),SNI 就默认可用,无需额外开启开关。
确认 SNI 是否已支持
运行以下命令检查:
nginx -V 2>&1 | grep -i "sni"
如果输出含 TLS SNI support enabled,说明支持;若显示 disabled,需升级 OpenSSL 并重新编译 Nginx(较旧系统才需此步,当前主流发行版如 Ubuntu 22.04+/CentOS 8+ 默认支持)。
配置多个独立 SSL 证书(推荐方式)
为每个域名单独写一个 server 块,路径、证书、域名一一对应:
- 确保每个
server_name值唯一且准确(如example.com和api.example.com是两个不同域名) - 证书与私钥路径必须可读,权限建议设为
644(.crt)和600(.key) - 所有
server块都监听443 ssl,不冲突——SNI 会在 TLS 握手阶段自动路由到对应证书
示例:
server {
listen 443 ssl;
server_name site-a.com www.site-a.com;
ssl_certificate /etc/letsencrypt/live/site-a.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site-a.com/privkey.pem;
# 其他配置...
}
<p>server {
listen 443 ssl;
server_name site-b.net api.site-b.net;
ssl_certificate /etc/letsencrypt/live/site-b.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site-b.net/privkey.pem;</p><h1>其他配置...</h1><p>}常见误区与注意事项
-
不要把多个证书写在同一个
server块里(如ssl_certificate cert1.pem; ssl_certificate cert2.pem;)——Nginx 不识别这种写法,会报错或行为异常 -
避免用通配符覆盖多个主域(如
*.example.com只能匹配子域,不能匹配another.com) - 若需同一域名多个证书(如 RSA + ECDSA),可使用
ssl_certificate+ssl_certificate_key配合ssl_trusted_certificate实现双栈,但非“多域名”场景 - HTTP/2 要求 ALPN,而 ALPN 依赖 SNI,所以多证书配置天然兼容 HTTP/2
验证是否生效
重启 Nginx 后,用以下命令逐个验证证书是否被正确返回:
openssl s_client -connect site-a.com:443 -servername site-a.com -showcerts 2>/dev/null | openssl x509 -noout -text | grep "Subject:
替换 site-a.com 为你的域名,观察 Subject 中 CN 或 SAN 是否匹配预期证书。
浏览器访问各域名,地址栏锁图标应显示“安全”,点击可查看证书详情,确认签发对象一致。


















