⭐ 推荐:社区规则条款 V1.0

通配符SSL证书怎么选,能覆盖几级子域名?

阿乐
阿乐 资深会员
发布于 2026-10-25 23:15 ·4 浏览 ·2 回复
内容摘要

通配符SSL证书只覆盖一级子域名且不含根域名,根域名和更深层级需作为SAN一并签发;固定域名少于5个宜用多域名证书,多且动态可用通配符组合,纯技术站点选DV、需展示企业资质选OV。

**结论:通配符 SSL 证书只覆盖一级子域名。*.example.com 能覆盖 a.example.com、b.example.com,但覆盖不了 a.b.example.com,也不包含 example.com 本身。** 想要更深的层级或根域名,唯一的办法是把它们作为 SAN(Subject Alternative Name,证书的备用域名列表)加进同一张证书一起签发。

通配符 SSL 证书能覆盖几级子域名?

结论:只能覆盖一级,且通配符必须是完整的最左侧标签。*.example.com 匹配任意一个标签,a.example.com ✅、b.example.com ✅、a.b.example.com ❌、example.com ❌。CA/B Forum 基线要求和 RFC 6125 都规定:* 不能与其他字符混用,也不能出现在非最左位置。所以 w*.example.com、*.*.example.com、api.*.example.com 这类写法,公网信任的 CA 一律不会签发。极少数内部自签或旧版客户端可能放行,但不能用于生产环境。

*.example.com 为什么不含 example.com?

结论:通配符要求至少替换掉一个标签,根域名没有标签可替换。这是很多站长购买通配符证书后访问主站报错的直接原因。正确做法是签发时把根域名一并写进去。以 Let's Encrypt 的 acme.sh 为例:

acme.sh --issue -d example.com -d '*.example.com' --dns dns_ali

注意 *.example.com 必须加单引号,否则 shell 会把它当成当前目录下的文件名展开,导致签发失败。签发后用 openssl x509 -in cert.pem -noout -ext subjectAltName 确认输出里同时有 DNS:example.com, DNS:*.example.com。

多级子域名场景怎么配?

结论:固定域名少于 5 个时,用多域名证书(SAN 证书)更划算;子域名数量多、动态增加时,才用通配符加多通配符组合。

具体分三种情况:

  1. 只有一级子域名:一张 *.example.com + example.com 就够。
  2. 有固定二级子域名(如 a.b.example.com):把 *.b.example.com 加进同一张证书的 SAN,做成“多通配符证书”,一张证书同时管理 *.example.com 和 *.b.example.com。
  3. 业务线隔离:不同业务用不同通配符,如 *.api.example.com、*.cdn.example.com,避免一张证书私钥泄露导致所有子域名都无法安全使用。

通配符证书选 DV 还是 OV?

结论:纯技术站点选 DV 通配符即可,对外展示企业资质的站点选 OV 通配符;EV 通配符基本不用考虑。

  • DV 通配符:只验证域名控制权,自动化签发通常 10 分钟内完成,浏览器显示锁标。商业 CA 价格一般在每年 300~800 元区间;Let's Encrypt 免费,但有效期 90 天,必须自动化续期。
  • OV 通配符:需要提交营业执照做组织核验,签发周期 1~3 个工作日,价格通常在每年 1500~3000 元。证书详情里会显示公司名称。
  • EV 通配符:主流 CA 不签发 EV 通配符,也不要相信能签出来的报价。

证书有效期需要特别注意:公开信任证书单张最长 398 天,从 2026 年 3 月 15 日起缩短到 200 天,2027 年 3 月 15 日起 100 天,2029 年 3 月 15 日起 47 天。结论:通配符证书必须配置自动续期,手动续期迟早会漏。

通配符证书为什么只能用 DNS 验证?

结论:HTTP 文件验证无法证明你对该域名下所有子域名的控制权,所以通配符强制走 DNS-01 验证。做法是在 DNS 服务商添加 _acme-challenge.example.com 的 TXT 记录,CA 校验通过后签发。用 acme.sh 配合 DNS API 可以全自动完成并配置定时续期:

acme.sh --issue -d example.com -d '*.example.com' --dns dns_dp
acme.sh --install-cert -d example.com --key-file /etc/nginx/ssl/example.key \
  --fullchain-file /etc/nginx/ssl/example.pem \
  --reloadcmd "nginx -s reload"

dns_dp 对应 DNSPod,其他服务商换成 dns_ali、dns_cf 等即可。

怎么快速验证证书真实覆盖范围?

结论:不要只看商家宣传,直接用客户端命令探测实际下发的证书。执行:

openssl s_client -connect a.example.com:443 -servername a.example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -ext subjectAltName

输出里的 DNS: 列表就是实际覆盖范围,逐条核对目标域名是否在其中。

通配符证书的最大风险是什么?

结论:私钥泄露的波及范围是整级子域名,不是单个站点。因此至少要保证三点:私钥文件权限设为 600 且不放在 Web 目录;测试环境和生产环境不用同一张通配符;开启 CT 日志(Certificate Transparency,证书透明度日志,公开记录所有签发的证书)监控,一旦有人给你的域名签了未知证书能第一时间收到告警。

回到最初的问题:选型先数子域名层级和数量,一级多个就上通配符并把根域名加进 SAN,有二级固定域名就做多通配符或 SAN 证书;验证方式只能选 DNS,续期必须自动化。这几条做到位,通配符证书才真正省心。

本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-2555.html
转载请注明出处,版权归原作者所有。

全部回复 2

周末
周末 萌新站长 1楼 2026-10-25 23:37

覆盖层级的结论没错,我再补充几个实际部署中容易出问题的地方。

一、Let's Encrypt 的通配符只能走 DNS-01 验证,HTTP-01 一定失败。用 acme.sh 时 --dns dns_ali 要求先提供 API 凭证(export Ali_Key=xxx Ali_Secret=xxx 后再执行,acme.sh 会把凭证写入 account.conf,后续续期自动使用)。很多人第一次手动签发成功,三个月后自动续期静默失败,就是因为凭证只在当前 shell 有效。建议直接加上 --reloadcmd "systemctl reload nginx",并把续期交给 cron 管理;否则证书更新了但服务没有重新加载,等于没有更新。

二、多通配符和 SAN 的成本结构不一样。 LE 单张证书最多 100 个名字,*.example.com 加 *.b.example.com 放在一张证书里没问题;商业 CA 的多通配符往往是独立 SKU,并非加 SAN 就能解决,报价可能翻倍。如果固定域名少于 5 个,直接买多域名 SAN 证书更便宜,也省去通配符私钥泄露的连带风险。

三、私钥分发是通配符最大的隐性成本。 部署到 CDN、多节点或容器环境时,私钥要分发到每台机器,一旦泄露,所有一级子域名都会受到影响。按业务线拆成 *.api、*.cdn 这类子通配符确实更稳妥;同时把私钥权限设为 600,并且不要提交到 Git。

常见问题:nginx 的 server_name *.example.com 不会匹配 example.com,必须显式写上根域;老版本 Android 对证书链要求严格,务必配置 fullchain.pem,不要只配置 cert.pem,否则浏览器正常,但 App 内请求会报错;续期后顺手用 openssl x509 -noout -ext subjectAltName -in cert.pem 再检查一遍,确认根域仍在列表里。

chinaz
chinaz 初级会员萌新站长 #2900 2楼 2026-10-25 23:53
周末:覆盖层级的结论没错,我再补充几个实际部署中容易出问题的地方。 **一、Let's Encrypt 的通配符只能走 DNS-01 验证**,HTTP-01 一定…

补充得很到位,DNS-01 凭证和 reloadcmd 这两处正是自动续期静默失败的高发区,我再补三个部署细节。

一、续期失败默认是“静默”的,要主动让它响。 acme.sh 装完 cron 后不会通知任何人,建议把 renew 的输出重定向到日志文件,定期检查,或者用 --notify-hook 加上邮件/webhook 通知。另外可以加 --days 30 把续期提前量拉长,DNS 接口临时抽风时不至于一次没续上就进入危险期。想手动验证流程,直接跑一遍 acme.sh --cron --home ~/.acme.sh,能复现 cron 环境下的真实情况。

二、DNS-01 可以用 CNAME 委派,把凭证集中到一处。 把 _acme-challenge.example.com CNAME 到统一的 _acme.zone.example.net,只需要在一个 DNS 服务商那里维护一套 API 凭证,多业务线拆 *.api、*.cdn 时不用给每家都配 key。你说的凭证只在当前 shell 有效的问题,这样也能一并绕开。

三、注意 CT 日志会把 SAN 全部公开。 公网 CA 签发的证书会写进 Certificate Transparency 日志,如果把内网系统的主机名(比如 oa.b.example.com)加进公网证书的 SAN,等于把内部结构公开了。这类服务建议走私有 CA,或者至少别用真实业务命名。

nginx 那边顺手补一句:server_name example.com *.example.com; 写在一行就行,比拆两个 server 块省事。另外 reloadcmd 失败时 acme.sh 只在日志里记一条,建议改成 nginx -t && systemctl reload nginx,避免配置有问题导致 reload 失败、而证书其实已经换掉了。