nginx支持多域名共用一张san证书,前提是证书的san字段包含所有server_name域名,并配合sni协议验证匹配性;需全局配置证书路径,确保各server块中域名均在san内,且openssl版本≥1.0.2。

Nginx 支持多个域名共用一张多域名(SAN)SSL 证书,前提是证书本身已正确包含所有目标域名,且配置方式符合 TLS 握手逻辑。这不是靠 Nginx “智能识别”,而是依赖证书的 Subject Alternative Name(SAN)字段 + SNI 协议协同工作。
关键前提:证书必须覆盖全部域名
浏览器在 HTTPS 连接建立前,会检查证书中 SAN 字段是否包含当前请求的 server_name。若缺失,直接报“证书不匹配”错误,Nginx 不会干预或兜底。
- ✅ 正确示例:证书 SAN 包含
example.com、www.example.com、api.example.org→ 这三个域名可共用同一张证书 - ❌ 错误做法:证书只含
example.com,却在server_name中写shop.example.com→ 浏览器警告,连接失败
统一证书路径,单次加载
Nginx 允许在 http 块中全局定义证书,所有 server 块自动继承,节省内存、避免重复读取:
http {
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# 其他配置...
}
server {
listen 443 ssl http2;
server_name api.example.org docs.example.org;
# 其他配置...
}
}
- 所有
server块无需再写ssl_certificate和ssl_certificate_key - 必须确保每个
server_name列表中的域名,全部出现在该证书的 SAN 中 - 不需要为每个域名单独申请证书,也不需拆分
server块来“绑定”证书
SNI 是默认启用的,无需额外开关
只要 Nginx 编译时链接了 OpenSSL ≥1.0.2(现代发行版默认满足),且运行时 nginx -V 显示 OpenSSL 版本(如 OpenSSL 1.1.1w),SNI 就在 TLS 握手阶段自动生效——客户端发来的域名信息会被 Nginx 用于验证证书匹配性,整个过程对配置透明。
通配符要谨慎搭配 SAN
如果用了 *.example.com,它只匹配一级子域(如 shop.example.com),但不匹配:
- 根域
example.com(需显式加入 SAN) - 二级子域
dev.api.example.com(需单独加或换多级通配符)
所以更稳妥的做法是:申请时明确列出全部域名,例如:
DNS.1 = example.com DNS.2 = www.example.com DNS.3 = shop.example.com DNS.4 = api.example.com
验证是否生效
用 OpenSSL 直连测试(替换为你的真实域名和 IP):
openssl s_client -connect your-server-ip:443 -servername example.com -showcerts 2>/dev/null | openssl x509 -noout -text | grep -A1 "Subject Alternative Name"
输出应显示 example.com 在 SAN 列表中;换 api.example.com 再试,应同样命中同一张证书。
配置完成后 reload:nginx -s reload,无需重启。











