Nginx 1.11.0+ 默认支持 SNI,需确保 OpenSSL ≥1.0.2、编译含 --with-http_ssl_module;每个域名须用独立证书和 server 块,ssl_certificate 路径不可复用,server_name 必须与证书 SAN/CN 精准匹配,并可设 default_server 兜底老旧客户端。

直接配置就行,Nginx 1.11.0+ 版本默认支持 SNI,不需要额外开启开关或添加特殊指令。关键在于结构正确、证书隔离、域名精准匹配。
确认底层支持 SNI
运行以下命令检查 OpenSSL 版本:
nginx -V 2>&1 | grep -i openssl
输出应类似 OpenSSL 1.1.1w 或更高(≥1.0.2)。若显示 BoringSSL 或无输出,说明不支持 SNI,需更换官方预编译包或重编译 Nginx。
Nginx 编译时必须启用 --with-http_ssl_module,可通过 nginx -V 查看是否包含该参数。
为每个域名准备独立证书
不能混用证书路径,也不能把多个域名的证书塞进同一个 PEM 文件——这不是“合并”,而是错误配置,会导致 TLS 握手失败或浏览器报错。
- 推荐用 certbot 分开申请: certbot --nginx -d site-a.com certbot --nginx -d site-b.net 这样会在 /etc/letsencrypt/live/ 下生成隔离目录
- 每个域名的 ssl_certificate 和 ssl_certificate_key 必须指向其专属路径,例如:
ssl_certificate /etc/letsencrypt/live/site-a.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site-a.com/privkey.pem;
编写独立的 server 块并精确绑定
每个域名一个 server 块,监听 443,靠 server_name 和证书路径双重锁定:
- 必须写 listen 443 ssl http2;(http2 可选但推荐)
-
server_name 要与证书的 SAN(Subject Alternative Name)或 CN 完全一致,例如证书含 www.site-a.com 和 site-a.com,就写:
server_name site-a.com www.site-a.com; - 禁止多个 server 块共用同一组 ssl_certificate 路径——Nginx 不报错,但只加载第一个块的证书,其余全部 fallback
处理无 SNI 的老旧请求
某些嵌入式设备或极老客户端(如 Windows XP 上 IE6)不发 SNI 字段,Nginx 会使用监听 443 端口上第一个定义的 server 块的证书响应。
如需统一兜底,可显式定义一个带 default_server 标志的块,放在所有 HTTPS server 块最前面:
server {
listen 443 ssl http2 default_server;
server_name _;
ssl_certificate /path/to/default/fullchain.pem;
ssl_certificate_key /path/to/default/privkey.pem;
return 444;
}


















