Nginx 中 SSL 证书如何配置通配符证书支持所有子域名

作者:袖梨 2026-08-28

一个 .example.com 通配符证书可统一支持所有一级子域名,需确保证书含 DNS:.example.com 和 DNS:example.com、使用 fullchain.pem 和权限为600的私钥,并用正则 server_name ~^(?<subdomain>.+).example.com$ 统一匹配。

Nginx 配置通配符 SSL 证书支持所有一级子域名,核心不是堆配置,而是让证书、域名、Nginx 指令三者严格对齐。只要做到这几点,一个 *.example.com 证书就能同时服务 www.example.comapi.example.comshop.example.com 等所有一级子域,无需为每个子域单独申请或写多个 server 块。

确认证书本身覆盖范围合规

通配符证书有明确边界,不能靠猜测:

*.example.com 覆盖:www.example.comblog.example.comdev.example.com

❌ 不覆盖裸域名 example.com——必须在证书的 SAN(Subject Alternative Name)中显式添加 DNS:example.com

❌ 不覆盖二级子域,如 staging.us.example.comadmin.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.comDNS:example.com(如果需要根域 HTTPS)

规范存放证书文件并设置权限

  1. 推荐路径:/etc/nginx/ssl/example.com/(Linux)或 conf/ssl/example.com/(Windows,避免中文与空格)
  2. 必须使用完整证书链:fullchain.pem(即域名证书 + 中间证书),不能只用 cert.pem,否则浏览器提示“证书不可信”
  3. 私钥文件命名为 privkey.pemexample.com.key,Linux 下设权限为 600
    chmod 600 /etc/nginx/ssl/example.com/privkey.pem
  4. 所有 server 块必须指向同一组文件路径,禁止拆分、重命名或混用不同证书

用正则匹配统一接管所有一级子域

不必为 wwwapishop 各写一个 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_headerfastcgi_param 中使用。

务必验证后再重载

每次修改后执行两步:

  1. sudo nginx -t:检查语法和路径是否有效
  2. 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 在线检测链完整性。

不复杂但容易忽略

相关文章

精彩推荐