nginx 的 ssl_certificate 不支持单指令配置多域名证书,必须通过 sni 分发(各域名独立 server 块配专属证书)或 san 证书(同一证书覆盖同主域多个域名)实现多域名 https。

Nginx 的 ssl_certificate 指令本身不支持一次配置多个域名的独立证书——它只能指向一个 PEM 文件,且该文件必须包含单张证书及其完整链(leaf + intermediate)。所以“同时配置多个域名”的关键不是让一条 ssl_certificate 指向多个证书,而是通过结构设计实现多域名 HTTPS 正常工作。核心路径只有两条:SNI 分发(推荐) 或 SAN 证书合并(有限适用)。
用 SNI 为每个域名配专属证书
这是最标准、最灵活、最安全的做法,适用于不同主域(如 a.com 和 b.net)或需隔离管理的场景。
- 每个域名对应一个独立
server块,监听443 ssl - 每个块中
server_name明确列出该域名(含 www 等变体) - 每个块单独指定
ssl_certificate和ssl_certificate_key,路径必须严格对应其证书 - ✅ 优势:证书完全隔离,续期/吊销互不影响;支持任意主域组合
- ❌ 禁忌:不要把两个域名的私钥或证书混进同一个 PEM 文件;也不要让多个
server块共用同一组证书路径(Nginx 只加载第一个块的证书)
示例:
server {
listen 443 ssl http2;
server_name a.com www.a.com;
ssl_certificate /etc/letsencrypt/live/a.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/a.com/privkey.pem;
# … 其他配置
}
server {
listen 443 ssl http2;
server_name b.net www.b.net;
ssl_certificate /etc/letsencrypt/live/b.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/b.net/privkey.pem;
# … 其他配置
}
用一张 SAN 证书覆盖多个域名
适合同属一个组织、可统一管理的域名(如 example.com、www.example.com、shop.example.com),但有明确限制:
- 所有域名必须出现在同一张证书的 Subject Alternative Names(SAN)列表中
- 通配符
*.example.com仅匹配一级子域,不包含根域example.com(除非显式加入 SAN) - 不能跨主域:
*.example.com无法用于another.com - 证书文件路径在多个
server块中可复用(因为是同一张证书)
示例(同一证书服务三个域名):
server {
listen 443 ssl http2;
server_name example.com www.example.com shop.example.com;
ssl_certificate /etc/ssl/certs/example-san.pem;
ssl_certificate_key /etc/ssl/private/example-san.key;
}
注意:
server_name这里可以写多个空格分隔的域名,但前提是它们全部被签入该证书的 SAN 字段。
验证是否生效,别只看浏览器
浏览器缓存或 HSTS 可能掩盖问题,建议用 OpenSSL 直连验证 SNI 行为:
openssl s_client -connect your-server-ip:443 -servername a.com -showcerts 2>/dev/null | openssl x509 -noout -subject openssl s_client -connect your-server-ip:443 -servername b.net -showcerts 2>/dev/null | openssl x509 -noout -subject
两次输出应分别显示 CN=a.com 和 CN=b.net,才说明 SNI 正确分发。
不复杂但容易忽略











