一个 .example.com 通配符证书可统一支持所有一级子域名,需确保证书含 DNS:.example.com 和 DNS:example.com、使用 fullchain.pem 和权限为600的私钥,并用正则 server_name ~^(?<subdomain>.+).example.com$ 统一匹配。
Nginx 配置通配符 SSL 证书支持所有一级子域名,核心不是堆配置,而是让证书、域名、Nginx 指令三者严格对齐。只要做到这几点,一个 *.example.com 证书就能同时服务 www.example.com、api.example.com、shop.example.com 等所有一级子域,无需为每个子域单独申请或写多个 server 块。
确认证书本身覆盖范围合规
通配符证书有明确边界,不能靠猜测:
✅ *.example.com 覆盖:www.example.com、blog.example.com、dev.example.com
❌ 不覆盖裸域名 example.com——必须在证书的 SAN(Subject Alternative Name)中显式添加 DNS:example.com
❌ 不覆盖二级子域,如 staging.us.example.com 或 admin.api.example.com——这类需额外申请 *.api.example.com 或用多 SAN 证书
验证方式(Linux/macOS 终端执行):
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 或 example.com.key,Linux 下设权限为 600:chmod 600 /etc/nginx/ssl/example.com/privkey.pem
用正则匹配统一接管所有一级子域
不必为 www、api、shop 各写一个 server 块。一条正则规则即可:
server {listen 443 ssl http2;server_name ~^(?<subdomain>.+).example.com$;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>.+) 捕获子域名部分(如 api 来自 api.example.com),后续可直接在 proxy_set_header 或 fastcgi_param 中使用。
务必验证后再重载
每次修改后执行两步:
sudo nginx -t:检查语法和路径是否有效sudo nginx -s reload:平滑重载,不中断连接若用 Let’s Encrypt,确保 fullchain.pem 已正确生成(certbot 默认不自动合并中间证书,acme.sh 则默认包含);可用 curl -I --insecure https://test.example.com 看响应头是否含 SSL certificate verify ok,或用 SSL Labs 在线检测链完整性。
不复杂但容易忽略