通配符SSL证书.example.com可安全服务所有一级子域,但需确保SAN包含.example.com和example.com、证书路径正确、server_name正则匹配一致,并验证配置后重载。

配置 Nginx 支持通配符 SSL 证书,关键不是“加几行配置”,而是让证书、域名、配置三者严格对齐。只要 SAN 列表正确、路径无误、server_name 匹配得当,一个 *.example.com 证书就能安全服务所有一级子域(如 api.example.com、shop.example.com),无需为每个子域单独申请或配置。
确认证书覆盖范围是否合规
通配符证书 *.example.com 有明确限制:
- ✅ 覆盖 任意一级子域名:www.example.com、blog.example.com、dev.example.com 都有效
- ❌ 不覆盖 裸域名(example.com)——必须在证书的 SAN 中显式添加
- ❌ 不覆盖 二级及以上子域:dev.api.example.com、staging.us.example.com 都不匹配,需额外申请 *.api.example.com 或使用多 SAN 证书
验证方式:运行 openssl x509 -in example.com.pem -text -noout | grep -A1 "Subject Alternative Name",确保输出中同时包含 DNS:*.example.com 和 DNS:example.com(若需根域访问)。
规范存放证书文件并设置权限
推荐统一存放在 /etc/nginx/ssl/example.com/ 目录下(Linux)或 conf/ssl/example.com/(Windows,路径避免中文和空格):
-
证书链文件:用
fullchain.pem(即域名证书 + 中间证书),不要只用cert.pem,否则浏览器会报“证书不可信” -
私钥文件:用
privkey.pem或example.com.key,Linux 下设权限为600(chmod 600),确保只有 nginx 用户可读 - 所有 server 块必须指向同一组文件路径,禁止拆分或重复命名
用正则 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)。该规则不匹配 example.com 或 dev.api.example.com。
补充根域名与 HTTP 自动跳转
用户常直接访问 example.com,建议另建一个 server 块处理根域,并强制跳转 HTTPS:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
<p>server {
listen 443 ssl http2;
server_name example.com;</p><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;
# 其余配置同上}
注意:此块能生效的前提是证书 SAN 中已包含 example.com;否则浏览器会提示证书错误。
每次改完配置,务必先运行 nginx -t 验证语法和路径,再 nginx -s reload。漏掉中间证书、路径拼错、SAN 缺失——这三类问题占线上 HTTPS 中断的 90% 以上。


















