多域名共用 SSL 证书需使用 SAN 证书,Nginx 通过单个 server 块配置多个 server_name 并指定唯一证书路径实现;申请时须一次性包含所有域名,HTTP 跳转也需同步匹配全部 server_name。

多域名共用 SSL 证书,本质是用一张支持多个域名的 SAN(Subject Alternative Name)证书,配合 Nginx 的单个 server 块实现 HTTPS 服务。这种方式适合域名间业务逻辑一致、证书可统一管理的场景,比如 example.com、www.example.com 和 shop.example.com 都指向同一套前端或 API。
必须用 SAN 证书,不能靠 server_name 拼接
Nginx 在 TLS 握手阶段只根据 server_name 列表里的第一个域名去匹配证书中的 SAN 字段。如果证书没包含其余域名,浏览器就会报“证书不匹配”。所以:
- 申请证书时必须一次性指定所有要覆盖的域名,例如:
certbot -d example.com -d www.example.com -d shop.example.com - 生成的证书(
fullchain.pem)里必须包含全部域名,可通过命令验证:openssl x509 -in fullchain.pem -text -noout | grep -A1 "Subject Alternative Name" -
server_name可以写多个,用空格分隔,但仅用于 HTTP 层路由和变量取值(如$host),不参与证书加载逻辑
配置结构:一个 server 块 + 多个 server_name + 单套证书路径
只需一个 server 块监听 443 端口,把所有域名列在 server_name 后,证书路径只配一次:
server {
listen 443 ssl http2;
server_name example.com www.example.com shop.example.com;
ssl_certificate /etc/nginx/certs/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
location / {
root /var/www/html;
index index.html;
}
}
注意:ssl_certificate 和 ssl_certificate_key 路径是唯一的,不随域名变化;Nginx 不会为每个 server_name 加载不同证书。
HTTP 自动跳转也要覆盖全部域名
配套的 80 端口重定向块,server_name 必须和 HTTPS 块保持一致,否则部分域名可能无法跳转:
- 错误写法:
server_name example.com;→ 只有example.com能跳转,www和shop仍走 HTTP - 正确写法:
server_name example.com www.example.com shop.example.com; - 跳转语句统一用
return 301 https://$host$request_uri;,自动适配当前请求的 Host
泛域名与根域名需额外处理
*.example.com 证书不自动包含 example.com。若两者都要支持,必须显式加入 SAN:
- 申请时加
-d example.com -d *.example.com - 或者分别配置两个
server块:一个专配example.com,另一个配*.example.com(需 SNI 支持,且证书分开) - 不推荐混用通配符和非通配符在同一个证书中依赖客户端兼容性,建议统一用多域名 SAN 方式


















