一张泛域名证书(如.example.com)可让Nginx统一支持多个子域名HTTPS访问,只需一个server块配置server_name example.com .example.com,并确保证书同时包含根域名与通配符,DNS解析到位且续期时显式声明全部域名。

用一张泛域名证书(如 *.example.com)让 Nginx 同时支持多个子域名的 HTTPS 访问,是高效又安全的做法。关键不是给每个子域名单独配 server 块,而是靠证书覆盖能力 + 正确的 server_name 声明 + DNS 解析配合。
泛域名证书必须包含主域名和通配符
Let’s Encrypt 的泛域名证书默认不自动包含根域名(example.com),只覆盖 *.example.com。如果你希望 example.com 也走 HTTPS,申请时必须显式加上:
certbot certonly --dns-cloudflare -d example.com -d *.example.com- 验证通过后,用
openssl x509 -in cert.pem -text -noout | grep -A1 "Subject Alternative Name"检查输出中是否同时有 DNS:example.com 和 DNS:*.example.com - 漏掉 example.com 会导致访问根域名时浏览器提示“证书不匹配”
Nginx 只需一个 HTTPS server 块
泛域名证书天然支持所有匹配的子域名,Nginx 不需要为 api.example.com、admin.example.com、blog.example.com 各建一个 server 块。统一配置如下:
listen 443 ssl http2;-
server_name example.com *.example.com;—— 这里 *.example.com 是通配符,Nginx 会自动匹配任意一级子域名 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;- 所有子域名共用同一套 root、location、headers 等逻辑,简化维护
DNS 解析与实际使用要对齐
证书能匹配,不代表用户能访问到。你还得确保:
- 所有要用的子域名(如 api.example.com)在 DNS 中已添加 A 或 CNAME 记录,指向你的服务器 IP
- 泛域名记录 *.example.com 的 TTL 建议设低(如 300 秒),便于后续快速调整
- 若用 Cloudflare 等 CDN,注意开启“代理状态(Proxied)”并确认其支持 SNI 透传,否则 TLS 握手可能失败
- 浏览器访问 test123.example.com 时,只要 DNS 解析成功且证书含 *.example.com,就能建立 HTTPS 连接——无需提前在 Nginx 配置里写死该子域名
续期必须重申全部域名
泛域名证书续期不是“自动更新”,而是重新签发。每次运行 certbot renew 或手动续期,都必须带上完整域名列表:
-
certbot renew --force-renewal默认只续已存在的证书,但不会自动加新域名 - 如果新增了 shop.example.com,不能只改 Nginx 配置,必须重跑:
certbot certonly --dns-cloudflare -d example.com -d *.example.com -d shop.example.com - 续期后记得 reload Nginx:
nginx -s reload


















