通配符证书在Nginx中实现多子域HTTPS需确保四点:SAN覆盖严格一级子域且不含裸域名和二级子域;证书文件统一存放、路径规范、权限正确;所有server块共用相同证书路径且server_name在SAN中;reload前必须nginx -t验证并确认证书链完整。

通配符证书(如 *.example.com)在 Nginx 中实现多子域 HTTPS,关键不在“能不能配”,而在于“证书是否真覆盖、配置是否不越界、链路是否完整”。以下四点是生产环境中最常出错也最需盯紧的核心环节。
确认证书实际覆盖的域名范围
通配符只匹配**严格的一级子域名**,且不自动包含根域:
-
*.example.com ✅ 可用于
www.example.com、api.example.com、shop.example.com -
*.example.com ❌ 不可用于
example.com(裸域名),必须显式加入证书的 SAN 列表 -
*.example.com ❌ 不可用于
dev.api.example.com(二级子域),需单独申请*.api.example.com或使用多 SAN 证书
验证方式:用 openssl x509 -in example.com.pem -text -noout | grep -A1 "Subject Alternative Name" 查看实际 SAN 条目,确保每个 server_name 都出现在其中。
统一存放证书文件并规范路径
避免分散管理导致更新遗漏或路径错误:
- 将私钥(
example.com.key)与完整证书链(example.com.pem,即fullchain.pem,含域名证书 + 中间证书)放在 Nginx 配置可读路径下,例如:conf/ssl/example.com.key和conf/ssl/example.com.pem - Windows 下路径避免中文、空格、特殊符号;Linux 下注意文件权限(
nginx用户需有读取权,私钥建议600) - 切勿仅使用
cert.pem—— 缺少中间证书会导致浏览器“不安全”警告
各 server 块共用同一证书路径,不拆分也不重复定义
每个子域对应一个独立 server 块,但全部指向相同的证书文件:
- 所有块均启用
listen 443 ssl http2;,且ssl_certificate和ssl_certificate_key的路径完全一致 -
server_name必须是证书 SAN 中明确列出的域名(包括*.example.com和额外添加的example.com) - 不要为不同子域写多个
listen 443 ssl的全局指令;Nginx 依赖 SNI 自动路由,现代版本默认支持,无需额外开启
重载前务必验证配置并检查证书链完整性
配置更新后,一次失败的 reload 可能导致全站 HTTPS 中断:
- 每次修改后先执行
nginx -t,确认语法和路径无误 - 用在线工具(如 SSL Labs 的 SSL Test)或本地
curl -I --insecure https://test-sub.example.com检查响应头中是否有SSL certificate verify ok - 若用 Let’s Encrypt,确保使用
fullchain.pem而非cert.pem;acme.sh 默认生成该文件,certbot 则需明确指定--fullchain-path
配置本身不复杂,但容易忽略证书边界与链路完整性。只要 SAN 匹配、路径统一、链文件完整、reload 安全,通配符就能稳定支撑数十个子域。


















