Nginx配置泛域名HTTPS需用匹配的泛域名证书(如*.example.com)并分server块独立绑定,server_name必须与证书SAN严格一致,不支持单域名证书配泛域名,且需客户端SNI支持。

直接在 server 块中用 server_name 指令写泛域名,同时指定匹配该泛域的 SSL 证书路径即可。关键不是“泛域名能不能配”,而是证书本身必须是有效的泛域名证书(如 *.example.com),且 server_name 的值要与证书的 Subject 或 SAN 字段严格匹配。
证书必须是真正的泛域名证书
不能拿单域名证书(比如只含 www.example.com)去配 server_name *.example.com —— 浏览器会报错。Nginx 不校验证书有效性,但客户端会。确认方式:
- 用命令
openssl x509 -in your.crt -text -noout | grep -A1 "Subject Alternative Name" - 输出里必须包含
DNS Name=*.example.com,而不是只有example.com
server_name 写法要对应证书覆盖范围
泛域名证书 *.example.com 只能用于二级子域名,不能跨主域,也不能覆盖根域。所以:
- ✅ 正确写法:
server_name *.example.com;或server_name www.example.com api.example.com; - ❌ 错误写法:
server_name example.com;(根域没被证书覆盖) - ❌ 错误写法:
server_name *.test.example.com;(三级泛域,原证书不包含)
多个泛域名需分 server 块配置
一个 server 块不能混用不同泛域的证书。比如你有 *.a.com 和 *.b.com 两张证书,就得写两个独立的 server 块:
- 块1:
server_name *.a.com;+ssl_certificate a.com.crt; - 块2:
server_name *.b.com;+ssl_certificate b.com.crt;
Nginx 依靠 SNI 在 TLS 握手阶段选择对应证书,前提是客户端支持 SNI(几乎所有现代浏览器和工具都支持)。
兜底 default_server 要谨慎设
如果用了 default_server,它的证书会被用在无法匹配任何 server_name 的 HTTPS 请求上。建议:
- 不设
default_server,让不匹配的请求直接失败(更安全) - 若必须设,确保其证书至少覆盖常用域名,或使用通配符兼容性更强的 SAN 证书


















