DNS 的 CAA 记录不配置,对 SSL 证书自动签发到底有没有影响

实际使用中经常会遇到一个问题:域名接入了 CDN、负载均衡、对象存储、自建 Nginx,HTTPS 自动证书也开了,但证书签发偶尔失败。排查 DNS、HTTP-01、DNS-01、IPv6、回源端口之后,有人会问一句:是不是没配 CAA 记录导致的?

答案要分清楚:CAA 记录不配置,通常不会阻止 SSL 证书自动签发。大多数 CA 在查询域名 CAA 时,如果没有查到 CAA 记录,会认为域名没有限制授权,允许继续签发。也就是说,空 CAA 不是拒绝签发。

但这个问题不能只停在“有没有影响”这四个字上。在线上环境里,CAA 不配置一般不影响签发流程,但会影响证书签发的管控能力,也可能在一些复杂 DNS 场景里放大排查难度。

CAA 记录实际在控制什么

CAA,全称 Certification Authority Authorization,是 DNS 里的证书颁发机构授权记录。它的作用不是告诉浏览器怎么访问网站,也不是让 HTTPS 更快,而是告诉 CA:哪些机构可以给这个域名签发证书。

比如域名 example.com 配了这样的 CAA:

example.com. CAA 0 issue "letsencrypt.org"

这个意思是,只允许 Let's Encrypt 给 example.com 签发普通 SSL/TLS 证书。其他 CA,比如 DigiCert、GlobalSign、Sectigo,在签发前查到这条记录,就应该拒绝签发。

还有一种常见写法:

example.com. CAA 0 issuewild "letsencrypt.org"

这个控制的是通配符证书,比如 *.example.com。这里补充一点,issue 和 issuewild 是分开的。只配置 issue,不等于一定允许通配符证书;只配置 issuewild,也不等于普通单域名证书都能正常签。

不配置 CAA 时,自动签发通常怎么走

以常见自动证书流程来看,CA 会做几类检查:域名解析是否正常、验证方式是否通过、CAA 是否允许签发、是否触发风控或频率限制。

如果 DNS 中没有 CAA 记录,CA 查询结果是空,绝大多数情况下会继续签发。这个逻辑在 Let's Encrypt、ZeroSSL、DigiCert 这类 CA 场景里都很常见。

可以简单理解成下面这个判断:

没有 CAA 记录:域名没有声明限制,CA 可以签发。

有 CAA 记录且包含当前 CA:可以签发。

有 CAA 记录但不包含当前 CA:拒绝签发。

有 CAA 记录但 DNS 查询异常:可能延迟签发或签发失败。

所以,如果只是“没配 CAA”,一般不是自动签发失败的直接原因。实际排障时,不要一上来就盯着 CAA,更多时候是 ACME 验证没通过。

自动签发失败,常见原因反而在这些地方

实际使用中发现,证书自动签发失败,排在前面的通常不是 CAA,而是域名验证链路有问题。

HTTP-01 验证被重定向或拦截

很多自动签发工具会在 http://example.com/.well-known/acme-challenge/ 下放一个验证文件。CA 访问这个路径,能读到正确内容就通过。

问题是线上经常有这些配置:

全站 301 到 HTTPS,但 HTTPS 证书还没签下来;WAF 拦截了 /.well-known/ 路径;Nginx rewrite 把验证路径转到了业务后端;CDN 缓存了旧的 challenge 内容;IPv6 解析到了另一台没部署验证文件的机器。

这种情况下,CAA 配不配置都没用,因为 CA 连域名所有权验证都过不去。

DNS-01 验证的 TXT 记录没生效

申请泛域名证书时,经常用 DNS-01。自动化脚本会写入 _acme-challenge.example.com 的 TXT 记录。

失败点一般在 TTL、DNS API 权限、主域和子域托管不一致、权威 DNS 解析延迟。比如控制台里看到了 TXT,实际用 dig 查权威 DNS 还没有,这时 CA 看到的仍然是空。

多说一句,很多人用公共 DNS 查,比如 8.8.8.8、1.1.1.1,看到记录就以为没问题。排证书签发最好直接查权威 DNS:

dig TXT _acme-challenge.example.com @ns1.example-dns.com

IPv4 正常,IPv6 坏了

这类问题很隐蔽。域名同时有 A 和 AAAA 记录,IPv4 机器上验证文件没问题,IPv6 指向了旧机器、空机器、或者防火墙没放行 80 端口。CA 访问时如果走了 IPv6,就失败。

遇到这种情况,临时移除 AAAA 记录往往能验证判断。长期还是要把 IPv6 的站点配置补齐,不然以后续签还会掉坑。

CAA 配错,才会真的影响签发

不配置 CAA 一般没事,配错 CAA 才是更容易踩的坑。

比如你之前用 Let's Encrypt,后来切到云厂商托管证书,云厂商背后用的是 DigiCert 或 Sectigo。域名里还保留着:

example.com. CAA 0 issue "letsencrypt.org"

这时新的 CA 查询 CAA 后发现自己不在授权名单里,就会拒绝签发。控制台上可能只提示“证书申请失败”“CAA forbidden”“CAA record prevents issuance”,有的面板提示还比较模糊。

再比如只配置了普通证书授权:

example.com. CAA 0 issue "letsencrypt.org"

然后去申请 *.example.com 通配符证书。如果 CA 对 issuewild 检查严格,而你的 CAA 策略又没有放开通配符签发,就可能失败。不同 CA 和不同场景下表现会有差异,但生产域名建议不要靠猜。

父域名和子域名的继承关系要注意

CAA 有一个经常被忽略的点:CA 会沿着域名层级向上查。

比如申请 api.test.example.com 的证书,CA 可能会检查:

api.test.example.com

test.example.com

example.com

如果子域名没有 CAA,父域名 example.com 配了 CAA 限制,那么父域名的限制可能会生效。

这在线上很常见。集团域名由总部安全团队管理,example.com 配了只允许 DigiCert;业务团队在 test.example.com 下用 Let's Encrypt 自动签发,结果一直失败。业务同学看自己的子域 DNS 没有 CAA,以为没限制,实际限制在父域。

排查时不要只查当前域名,应该向上查一遍:

dig CAA api.test.example.com

dig CAA test.example.com

dig CAA example.com

几种常见状态对签发的影响

这里用一个对照表的写法描述,便于排障时快速判断。

状态:域名没有任何 CAA 记录。影响:通常允许任意合规 CA 签发。常见结果:自动签发正常,安全管控较弱。

状态:CAA 里只允许 letsencrypt.org。影响:Let's Encrypt 可以签,其他 CA 大概率失败。常见结果:切换证书供应商时容易出问题。

状态:CAA 里配置多个 issue。影响:多个 CA 都可以签发。常见结果:适合多平台、多环境并行使用。

状态:只配置 issue,没有明确 issuewild。影响:普通证书通常正常,通配符证书要看 CA 检查逻辑和策略。常见结果:泛域名证书申请时需要重点确认。

状态:CAA 记录语法错误或 DNS 查询 SERVFAIL。影响:CA 可能无法判断授权。常见结果:签发延迟或失败。

状态:父域名配置了 CAA,子域名没配。影响:父域名策略可能继承到子域名。常见结果:子域自动签发被父域限制。

不配置 CAA 的真实风险

不配置 CAA,不代表 HTTPS 不安全。证书本身的加密强度、浏览器信任链、TLS 配置,不会因为没有 CAA 记录直接变差。

但从证书治理角度看,不配置 CAA 等于没有声明“谁可以给我的域名签证书”。只要某个 CA 通过了域名验证,它就可以签发。这在小站点影响不明显,在企业、多业务线、多云平台环境里就比较难控。

举个实际场景:一个域名同时接入 CDN、海外节点、内部测试环境、对象存储静态站点。不同团队都能操作 DNS 或验证文件。没有 CAA 的情况下,A 团队用 Let's Encrypt,B 团队用云厂商免费证书,C 团队用商业 OV 证书,后面查证书资产时会发现同一个主域下面证书来源很散。

证书来源散不是马上故障,但续期、吊销、审计、应急替换都会变麻烦。尤其是证书泄露或私钥误传时,要快速定位签发机构和影响范围,平时没有管控就会很被动。

什么时候建议配置 CAA

个人站、小型业务、只用 Let's Encrypt 自动签发,不配 CAA 也能跑。只要 DNS 和 ACME 验证链路稳定,自动续期一般没问题。

但下面这些场景,建议认真配置 CAA:

生产域名承载支付、登录、API、后台管理系统;公司有多个云平台同时申请证书;域名分给多个团队使用;需要固定使用 DigiCert、GlobalSign、Sectigo、Let's Encrypt 等指定 CA;安全审计要求记录证书签发授权;有通配符证书自动签发需求。

这里补充一点,如果业务本身跑在多节点、多线路环境,证书自动签发也要跟网络架构一起看。比如海外业务用香港节点承载静态站和 API,国内业务走电信单线或高防节点,证书验证路径不能只在一台机器上通。选服务器时也要考虑 DNS、CDN、WAF、源站之间的配合。如果你也在找这种面向游戏、企业、高防和海外业务的云服务器,可以看看129云,比如香港大宽带-D型适合海外访问和中小型 Web 业务,西安电信-B型带 100Gbps 单机防御,更偏国内电信和防护场景,客服热线 400-9177118。

CAA 记录怎么配更稳

如果明确只用 Let's Encrypt,可以这样配:

example.com. CAA 0 issue "letsencrypt.org"

如果还要签发通配符证书,建议把 issuewild 也写清楚:

example.com. CAA 0 issue "letsencrypt.org"

example.com. CAA 0 issuewild "letsencrypt.org"

如果同时使用 Let's Encrypt 和 DigiCert,可以配置多个 issue:

example.com. CAA 0 issue "letsencrypt.org"

example.com. CAA 0 issue "digicert.com"

example.com. CAA 0 issuewild "letsencrypt.org"

example.com. CAA 0 issuewild "digicert.com"

如果希望 CA 在发现未授权签发请求时通知安全邮箱,可以加 iodef:

example.com. CAA 0 iodef "mailto:security@example.com"

实际生产里,issue、issuewild、iodef 放在一起比较常见。不要只复制一条不理解的 CAA 到 DNS 控制台,后面换 CA 时很容易忘。

配置 CAA 后自动续期要重点观察

CAA 不是配完就结束。对自动证书来说,最怕的是当前证书还能用,看不出问题,等到续期窗口才失败。

比如证书还有 60 天有效期时,你把 CAA 改成只允许 DigiCert,但线上 ACME 客户端还是 Let's Encrypt。到了剩余 30 天自动续期,Let's Encrypt 查询 CAA 发现不允许签发,续期失败。业务直到证书快过期才报警,这时处理就比较赶。

所以改 CAA 后建议手动触发一次测试签发或 dry-run。以 certbot 为例,可以跑:

certbot renew --dry-run

如果是云厂商托管证书,也要在控制台重新申请一张测试证书,确认 CA 名称和 CAA 匹配。不要只看 DNS 控制台显示“已生效”。

DNS 查询异常比没有 CAA 更麻烦

没有 CAA 是明确的空结果,DNS 查询异常则是不确定状态。CA 查询 CAA 时,如果遇到 SERVFAIL、超时、权威 DNS 不稳定,有些 CA 会暂缓签发,有些会直接失败。

这种问题常见于自建 DNS、DNSSEC 配错、权威 DNS 迁移中、NS 记录新旧混用。业务访问可能正常,因为 A 记录缓存还在,但 CA 查 CAA 时刚好打到异常权威节点。

排这种问题时可以从多个公共出口查:

dig CAA example.com +trace

dig CAA example.com @8.8.8.8

dig CAA example.com @1.1.1.1

dig CAA example.com @223.5.5.5

如果 +trace 中某一级返回异常,就不要继续折腾证书客户端了,先把权威 DNS 修好。

多云和 CDN 场景下的 CAA 管理

多云环境里,CAA 更容易被忽略。域名 DNS 在 A 平台,CDN 在 B 平台,证书在 C 平台,源站在自建 Nginx。出问题时每个平台都显示“配置正常”,但合起来就是不工作。

比较稳的做法是维护一份域名证书来源清单,至少记录域名、证书类型、CA、验证方式、续期方式、DNS 托管位置、CAA 授权。这个东西不需要做得很复杂,关键是能查到当前域名到底允许谁签证书。

比如 example.com 主站用 DigiCert,api.example.com 用 Let's Encrypt,*.dev.example.com 用 ZeroSSL。那 CAA 就不能只在根域随便写一条,需要看是否要在子域单独覆盖策略。

还有一点,部分 CDN 平台申请免费证书时,背后的 CA 可能不是固定一个。今天是 DigiCert,另一个产品线可能是 TrustAsia 或 Sectigo。配置 CAA 前最好查平台文档,确认它要求授权哪些 CA 域名。

实际排障时的判断顺序

遇到 SSL 自动签发失败,可以按这个节奏看,不容易跑偏。

看报错里有没有 CAA、forbidden、unauthorized by CAA、CAA record prevents issuance 这类字样。如果有,直接查 CAA 授权。

没有 CAA 报错,就先查验证路径。HTTP-01 看 80 端口、/.well-known/acme-challenge/、301/302、CDN、WAF、IPv6。DNS-01 看 TXT 是否写到权威 DNS,TTL 是否过期,API 权限是否足够。

再查父域名 CAA。很多子域签发失败,根因在父域名。

然后查权威 DNS 是否稳定。特别是近期换过 NS、开过 DNSSEC、迁移过 DNS 服务商的域名。

如果这些都正常,再看 CA 频率限制、账户状态、域名命中风控、证书订单状态。

不配置 CAA 时该不该马上补

如果当前自动签发稳定,业务规模不大,不急着补 CAA。贸然加错,反而可能把下一次续期搞挂。

如果要补,建议先查当前线上所有证书的 Issuer。可以用浏览器看,也可以用 openssl:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -issuer -subject -dates

确认当前证书来自哪个 CA,再决定 CAA 怎么写。比如 Issuer 里看到 Let's Encrypt,就授权 letsencrypt.org;看到 DigiCert,就授权 digicert.com。云厂商托管证书要看它实际使用的 CA,不要只看云厂商品牌名。

加 CAA 后,马上做一次测试签发或续期演练。生产域名建议挑业务低峰期改 DNS,TTL 不要设得太长。常见 TTL 300 秒或 600 秒就够用,没必要一上来设 86400 秒,回滚会很难受。

几个容易混淆的点

CAA 不等于证书固定

CAA 只是限制哪些 CA 可以签发,不会指定某一张证书,也不会自动吊销旧证书。你今天把 CAA 改成只允许 DigiCert,以前 Let's Encrypt 已经签出来的证书不会因为这条 CAA 立刻失效。

CAA 不影响浏览器信任已有证书

浏览器访问 HTTPS 时主要验证证书链、域名匹配、有效期、吊销状态等。浏览器不会因为域名没有 CAA 就提示不安全。

CAA 配在错误 DNS 区域没有意义

有些域名做了子域 NS 委派。比如 dev.example.com 已经委派给另一套 NS,这时你在 example.com 的 DNS 面板里给 dev.example.com 加 CAA,不一定是权威答案。要看真实权威 DNS 在哪里。

不同 CA 对错误提示不一样

同样是 CAA 拒绝,有的 CA 会明确提示,有的云控制台只显示“申请失败”。这时候直接用 dig 查 CAA,比在控制台里反复点重试有效得多。

可以采用的配置模板

只用 Let's Encrypt 普通证书和通配符证书:

example.com. CAA 0 issue "letsencrypt.org"

example.com. CAA 0 issuewild "letsencrypt.org"

example.com. CAA 0 iodef "mailto:security@example.com"

使用 Let's Encrypt 做自动化,DigiCert 做商业证书:

example.com. CAA 0 issue "letsencrypt.org"

example.com. CAA 0 issue "digicert.com"

example.com. CAA 0 issuewild "letsencrypt.org"

example.com. CAA 0 issuewild "digicert.com"

example.com. CAA 0 iodef "mailto:security@example.com"

只允许商业 CA,不允许其他 CA 随意签发:

example.com. CAA 0 issue "digicert.com"

example.com. CAA 0 issuewild "digicert.com"

example.com. CAA 0 iodef "mailto:security@example.com"

改完后用 dig 确认:

dig CAA example.com

dig CAA example.com +trace

再用当前证书平台发起一次测试申请,确认自动签发链路没有被 CAA 拦住。