nginx支持多域名共享一张ssl证书,关键在于使用san或多域名证书,确保所有server_name域名均显式包含在证书san字段中,并在单个或多个server块中统一引用同一证书路径,同时启用sni。

Nginx 支持多个域名共享同一张 SSL 证书,关键在于证书类型匹配、配置方式合理,以及确保 TLS 层能正确识别每个域名。
证书必须覆盖所有 server_name 域名
SSL 握手发生在 HTTP 请求之前,Nginx 依赖证书的 Subject Alternative Name(SAN)字段或通配符规则来验证域名。
- 单域名证书(如
example.com.crt)只能用于example.com,其他域名会触发浏览器“证书不匹配”警告 - SAN 多域名证书可显式列出多个域名:
example.com,www.example.com,demo.example.org - 通配符证书
*.example.com仅匹配一级子域(如api.example.com,shop.example.com),但不匹配example.com(根域)或dev.api.example.com(二级子域) - 若需同时支持根域和子域,申请时必须把
example.com和*.example.com都加入 SAN 列表
统一证书路径,避免重复加载
推荐在 http 块中集中声明证书,让所有 server 块自动继承,既减少配置冗余,也节省内存:
http {
ssl_certificate conf/ssl/example.com.pem; # 含完整证书链
ssl_certificate_key conf/ssl/example.com.key;
server {
listen 443 ssl http2;
server_name example.com www.example.com;
root html/site1;
}
server {
listen 443 ssl http2;
server_name api.example.com;
root html/api;
}
}
注意:每个 server_name 的值都必须出现在证书的 SAN 中,否则客户端会报错。
确保 SNI 正常启用
现代 Nginx(1.9.1+)默认启用 TLS SNI 扩展,无需额外编译参数。它允许同一 IP + 443 端口为不同域名返回对应证书——前提是证书本身包含该域名。
- 检查 OpenSSL 是否支持 SNI:
nginx -V 2>&1 | grep -o with-openssl,再确认 OpenSSL 版本 ≥ 1.0.2 - 客户端需支持 SNI(IE7+ on Vista、Chrome、Firefox、Safari 均支持;老旧 Android 或嵌入式设备可能不支持)
证书文件管理要点
- 把
.pem(证书链)和.key(私钥)放在 Nginx 可读路径,如conf/ssl/,路径避免中文、空格、特殊字符 - Windows 下注意杀毒软件可能拦截私钥读取,可临时添加信任或关闭实时防护测试
- 私钥权限建议设为
600(Linux)或等效受限访问(Windows),防止未授权读取
不复杂但容易忽略。











