多域名HTTPS依赖SNI机制实现,需Nginx≥1.11.0且OpenSSL支持SNI,每个域名必须配置独立server块与专属证书路径,server_name须与证书SAN完全匹配,宝塔需手动修改配置并避免UI覆盖,验证须用openssl确认SNI分发正确。

多域名 HTTPS 本质上靠 SNI(Server Name Indication)实现,不是“绑定多个域名到一张证书”,而是“为每个域名配专属证书 + 独立 Nginx server 块”。关键不在证书本身怎么绑,而在服务器如何识别并分发——SNI 就是那个在 TLS 握手初期告诉 Nginx “我要访问哪个域名”的机制。
先确认底层支持 SNI
这是最容易被跳过的前提,但不满足就全白搭:
- 运行 nginx -V 2>&1 | grep -i openssl,输出必须含类似 OpenSSL 1.1.1w 或 3.0.13 的版本号;若显示 BoringSSL 或无输出,说明不支持 SNI,需换官方预编译包或重编译
- Nginx 版本建议 ≥1.11.0(主流系统默认满足),且编译时启用了 --with-http_ssl_module
-
listen 443 ssl 这一行已隐式启用 SNI,无需额外加
ssl_protocols或开关指令
每个域名一套证书 + 一个 server 块
不能图省事合并配置,必须严格一一对应:
- 用 Certbot 分开申请:例如 certbot --nginx -d site-a.com 和 certbot --nginx -d site-b.net,会在
/etc/letsencrypt/live/下生成隔离目录 - 每个 server 块内写明专属路径:
ssl_certificate /etc/letsencrypt/live/site-a.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site-a.com/privkey.pem; -
server_name 必须与证书的 SAN 字段完全一致:比如证书含
site-a.com和www.site-a.com,就写 server_name site-a.com www.site-a.com; - 禁止多个 server 块共用同一组
ssl_certificate路径——Nginx 不报错,但只加载第一个块的证书,其余全部 fallback
宝塔面板要绕过 UI 手动改配置
宝塔默认不支持单站点下多个域名各自配不同证书,UI 操作会覆盖你手动添加的 server 块:
- 找到站点配置文件:/www/server/panel/vhost/nginx/你的域名.conf
- 复制整个已有 HTTPS 的
server { listen 443 ssl; ... }块,粘贴一份在下方 - 修改新块中的 server_name(如
blog.example.com)和 ssl_certificate 路径(指向该域名的证书文件) - 证书文件权限必须是 600(
chmod 600 /path/to/your.key),路径避免中文、空格、特殊符号 - 改完后执行 nginx -t && nginx -s reload,不要点面板里的「重载配置」——它可能回滚你的修改
验证是否真正生效
别只看浏览器绿锁,要确认 SNI 是否按域名精准分发:
- 用 OpenSSL 模拟握手:
openssl s_client -connect site-a.com:443 -servername site-a.com -showcerts 2>/dev/null | openssl x509 -noout -subject
结果应显示CN = site-a.com;换成site-b.net应返回对应 CN - 对不发 SNI 的老旧客户端(如某些 IoT 设备),Nginx 默认使用第一个定义的 server 块证书响应。如需统一兜底,可显式加一个
default_server块 - 检查日志:
tail -f /var/log/nginx/error.log,留意SSL_CTX_use_PrivateKey_file类错误,通常指向路径或权限问题


















