通配符ssl证书(*.example.com)可覆盖所有一级子域名(如www、api),但不包含裸域名example.com和二级子域(如dev.api.example.com);需验证san含dns:*.example.com及dns:example.com,统一引用fullchain.pem与privkey.pem,nginx可用正则server_name ~^(?.+).example.com$统一匹配并reload生效。

通配符 SSL 证书(如 *.example.com)能让一个证书覆盖所有一级子域名,但配置必须精准——证书范围、文件路径、Nginx 匹配规则三者缺一不可。
确认证书实际支持的域名
通配符证书不是“万能匹配”,它有明确边界:
- ✅ 覆盖:www.example.com、api.example.com、shop.example.com 等任意一级子域
- ❌ 不覆盖:example.com(裸域名),必须显式添加到证书的 SAN 列表中
- ❌ 不覆盖:dev.api.example.com、staging.us.example.com 等二级及以上子域
验证方法(在服务器执行):
openssl x509 -in /etc/nginx/ssl/example.com/fullchain.pem -text -noout | grep -A1 "Subject Alternative Name"
输出中必须同时看到 DNS:*.example.com 和 DNS:example.com(如果需要根域 HTTPS)。
规范存放并正确引用证书文件
证书链和私钥必须路径统一、权限合理:
- 推荐目录:
/etc/nginx/ssl/example.com/(Linux)或conf/ssl/example.com/(Windows) - 使用 fullchain.pem(含域名证书 + 中间证书),不要只用 cert.pem,否则浏览器会提示“证书不可信”
- 私钥文件(如 privkey.pem)设权限为 600:
chmod 600 /etc/nginx/ssl/example.com/privkey.pem - 所有 server 块中的
ssl_certificate和ssl_certificate_key必须指向同一组文件
用正则 server_name 统一接管所有子域
无需为每个子域写独立 server 块,一条正则即可:
server {
listen 443 ssl http2;
server_name ~^(?<subdomain>.+)\.example\.com$;
<pre class="brush:php;toolbar:false;">ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;
# 可选:把子域名传给后端做路由
set $subdomain_name $subdomain;
location / {
proxy_pass https://backend;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
说明:~^ 表示启用正则匹配,(?<subdomain>.+)</subdomain> 捕获子域名部分(如 api 来自 api.example.com),供后续使用。
验证并重载 Nginx
配置完成后务必检查语法并确认生效:
- 测试配置:运行
nginx -t,确保返回 “syntax is ok” 和 “test is successful” - 重载服务:执行
nginx -s reload(或systemctl reload nginx) - 浏览器访问任意子域(如 https://test.example.com),地址栏应显示锁形图标,点击可查看证书信息是否包含对应域名











