ACME证书签发被DNS CAA拒绝:issue与issuewild排查指南
先保存 ACME order URL、失败 identifier、CA 错误 type/detail、申请的是普通还是 wildcard 证书,以及 CA 账户/环境;不要记录账户私钥。直接查询当前权威 NS 上目标 FQDN 的 CAA,跟随 CNAME并逐级检查父域,记录 flags、tag、value、TTL、SOA serial 与 DNSSEC 状态。普通签发检查 issue,wildcard签发重点检查 issuewild;若存在相关 property tag,至少一条必须授权目标 CA,空值可明确禁止。修复所有权威节点与 DNSSEC 后等待旧 TTL/负缓存,再创建新的受控 order。挑战成功不能越过 CAA拒绝。
直接答案
先保存 ACME order URL、失败 identifier、CA 错误 type/detail、申请的是普通还是 wildcard 证书,以及 CA 账户/环境;不要记录账户私钥。直接查询当前权威 NS 上目标 FQDN 的 CAA,跟随 CNAME并逐级检查父域,记录 flags、tag、value、TTL、SOA serial 与 DNSSEC 状态。普通签发检查 issue,wildcard签发重点检查 issuewild;若存在相关 property tag,至少一条必须授权目标 CA,空值可明确禁止。修复所有权威节点与 DNSSEC 后等待旧 TTL/负缓存,再创建新的受控 order。挑战成功不能越过 CAA拒绝。
一、先区分CAA与域名挑战
HTTP-01、DNS-01、TLS-ALPN-01 等挑战证明申请者控制域名;CAA 表达域名持有者对 CA 的签发授权。两者是独立门禁。
因此 _acme-challenge TXT 正确、challenge valid,证书仍可因 CAA失败。不要反复改 TXT 来解决授权 CA错误。
二、保存准确的Identifier
证书订单可能包含 apex、www、API、多个 SAN和 wildcard。CA 会针对订单中的相关 identifier 检查,任意一个失败都可能让整单无法签发。
列出每个 DNS identifier,逐一追踪 CAA。不要只查主域名。
三、确认ACME环境与CA身份
Staging 与 production 端点、不同品牌 CA 或中间服务可能使用不同 CAA issuer domain。以目标 CA 官方文档声明的 value 为准,不要把 ACME directory hostname直接当 CAA值。
记录客户端实际 directory URL和账户 ID尾部,避免 staging 测试通过却用另一 CA生产签发。
四、理解CAA记录结构
CAA RDATA包含 flags、property tag 和 value。常见 tag 有 issue、issuewild、iodef。value 可包含 issuer domain 与参数。
DNS 管理台可能将三个字段拆开输入,也可能要求整行格式。检查权威查询结果,而不是只看表单。
五、issue控制普通签发
issue property 授权指定 CA签发非 wildcard 证书。存在多个 issue 时,任一适用记录授权目标 CA即可;空 issuer value可表达不授权任何 CA。
不要假设只允许写一条。多 CA灾备可显式列出,但每条都扩大授权面,应有审计。
六、issuewild控制Wildcard
当签发 wildcard identifier 时,issuewild 可提供专门授权。若存在 issuewild,它对 wildcard 的处理优先于普通 issue 语义;配置只允许普通证书的 CA不一定允许 wildcard。
分别测试 example.com 与 *.example.com。不要用普通证书成功证明 wildcard CAA正确。
七、Wildcard不覆盖Apex
*.example.com 证书标识符不等于 example.com。很多订单同时请求二者,CAA与挑战需要按每个 identifier处理。
列出 SAN,不要只看证书显示名称。一个 apex 问题会拖累混合订单。
八、CAA会向父域查找
若目标名称没有适用 CAA,处理会沿 DNS 树向上寻找,直到找到记录或到达边界。子域未配置不等于无限制,父域的 CAA可能生效。
从完整主机名逐级查询到注册域,记录第一次有效结果。不要只查 apex 或目标 host其中一个。
九、CNAME改变查找路径
目标名称存在 CNAME 时,CAA 处理要按规范考虑别名目标和原名称/父域查找。CDN/SaaS 接入常因 CNAME目标的 CAA与自有域策略组合失败。
展开完整 CNAME链,检查每一步和循环。不要仅在 _acme-challenge 委派位置查 CAA。
十、DNS委派与子Zone
子域若委派为独立 zone,其权威数据、SOA和 CAA可与父 zone不同。DNS 控制台可能同时存在同名记录,但只有实际委派的权威响应有效。
从父区确认 NS委派,再直接查询子区每台权威。避免编辑未被互联网使用的 zone。
十一、检查全部权威服务器
多台 NS若 SOA serial或 CAA不一致,CA随机查询时会间歇成功/失败。逐台查询相同 FQDN,比较 answer、authority、AA、TTL和 DNSSEC。
修复 zone transfer/发布后再重试,不要靠多点重复申请碰运气。
十二、Anycast节点不一致
同一权威 IP可能由多个地区 anycast节点回答。单地点所有 NS一致仍不能排除某 PoP陈旧。使用多地区探针和供应商节点标识(若支持)验证。
发现区域差异时由权威服务商修复发布,不要不断增加 SOA serial制造版本堆叠。
十三、TTL与旧缓存
CAA修改后,递归解析器可在旧 TTL内继续使用缓存。此前名称/记录不存在还可能有负缓存。新记录的较低 TTL不会追溯缩短旧缓存。
根据修改前 TTL与 SOA负缓存参数计算最晚窗口。不要用固定“等5分钟”承诺。
十四、DNSSEC SERVFAIL会阻止签发
CAA查询链上 DS/DNSKEY/RRSIG错误可能让验证解析器返回 SERVFAIL。CA不能安全确认授权时通常不会忽略错误继续签发。
使用 validating resolver和 DNSSEC工具检查目标、CNAME与父域委派。不要关闭 CA端验证;修复 chain of trust。
十五、超时与权威可达性
权威 UDP/TCP 53、EDNS、分片、防火墙或 rate limit故障会导致 CAA lookup失败。A记录偶尔成功不代表 CAA查询稳定。
从多个网络测试 UDP与 TCP,检查权威日志和响应时长。不要只允许常见 A/AAAA查询类型。
十六、Unknown Critical Flag
CAA flags 的 issuer critical 位要求 CA在不理解 property tag时拒绝。误设 critical 与未知 tag可能意外阻止签发。
按 RFC与 CA支持列表配置。不要复制不理解的示例 flags。
十七、参数与Account Binding
CAA issuer value可以携带参数;某些 CA支持将授权绑定到特定 ACME账户等能力。参数名、账户 URI/ID或分隔格式错误,会导致看似授权 issuer却不适用。
只采用目标 CA官方文档支持的参数,并保护账户标识。修改前保留回滚记录。
十八、iodef不是签发授权
iodef 用于报告策略违规等信息,不会授权 CA签发。只配置 iodef而没有 issue并不能按你想象“允许通知的 CA”。
报告 URI可能包含联系信息,应按隐私和接收能力管理。
十九、空issue的阻断语义
显式空 issuer value可用于禁止任何 CA。迁移 CA时忘记移除旧阻断记录,会让所有签发失败。
列出全部 CAA RRset,不要只看第一条。DNS 工具输出顺序不代表优先级。
二十、多CA记录与授权面
同时列多个 issue可支持迁移/灾备,但任何被授权 CA都可能按其验证流程签发。定期删除不再使用的授权,避免历史供应商长期保留。
将 CAA当作域名安全配置纳入代码评审与变更审计。
二十一、CAA不会影响已有证书验证
CAA用于签发时的授权检查,不会让已经签发的证书立即在浏览器失效。修改 CAA后,现有证书通常继续到期/撤销。
如果浏览器报证书错误,检查证书链、域名、有效期和部署,不要把它直接归因于 CAA。
二十二、Renewal同样会检查
续期是新的签发操作,仍要满足当前 CAA。初次签发成功、几个月后续期失败,常因期间新增/修改 CAA、DNSSEC或委派。
续期监控应提前多次尝试并告警,保留足够时间修复,而不是到过期当天才发现。
二十三、DNS-01委派不等于CAA委派
_acme-challenge 可以通过 CNAME/NS委派给 DNS服务商,但 CAA检查针对证书 identifier的查找规则,不会因为 challenge TXT托管到别处就自动使用那里相同位置的 CAA。
分别绘制验证 TXT路径与 CAA路径,避免混用。
二十四、错误分类与ACME日志
保存 ACME problem document 的 type、detail、status、identifier和 subproblems,不只截客户端最后一句。一个订单可包含多个失败子问题。
日志不得包含 account key、DNS API token或完整私钥。订单 URL也应按内部敏感信息处理。
二十五、不要高频重复下单
未修复 CAA时反复创建订单只会失败,还可能触及速率限制并制造噪声。先用 DNS查询和 CA staging/检查工具确认,再受控重试。
自动化应按错误类型退避;CAA配置错误不是毫秒级瞬时故障。
二十六、变更前的安全设计
先列出现有与未来 CA、普通/wildcard需求、账户绑定、子域委派和灾备流程;降低旧 TTL;发布到所有权威;验证 DNSSEC;等待缓存;再切换 ACME。
不要在生产证书临近过期时同时更换 DNS服务商、CAA、ACME账户和挑战类型。
二十七、安全恢复步骤
冻结重复订单;保存失败 identifier;确认 CA/环境;逐级查询 CAA/CNAME/父域;检查全部权威与 DNSSEC;修正 issue/issuewild/参数;等待旧 TTL;用受控订单验证;部署证书前核对 SAN、链和私钥匹配;恢复自动续期。
任何 CAA放宽都应最小化,只授权实际 CA与必要账户。
二十八、常见错误
常见误区包括:challenge valid就认为一定签发;只查 apex;忽略父域继承;普通 issue可以自动授权 wildcard;把 ACME目录域名当 issuer value;只查一台 NS;DNSSEC SERVFAIL当“无记录”;空 issue未发现;critical flag乱设;高频重复订单;CAA错误用重发 TXT解决;把 challenge委派与 CAA查找混为一谈。
另一个危险错误是为了紧急签发删除全部 CAA且不恢复。应精确授权目标 CA并保留审计。
二十九、修复后的验收清单
确认订单每个 identifier已检查;普通/wildcard授权正确;目标 CA issuer value准确;参数/账户绑定正确;父域/CNAME/委派路径可解释;全部权威和 anycast地区一致;SOA serial同步;DNSSEC验证通过;UDP/TCP可达;旧缓存窗口结束;受控订单成功;证书 SAN、有效期和链正确;自动续期在到期前有监控。
最后对未授权测试 CA验证其仍被拒绝,证明修复没有把策略放宽成任意签发。
FAQ
1. HTTP-01或DNS-01挑战成功为什么仍签发失败?
挑战证明域名控制,CAA另行决定目标 CA是否获授权。两者都必须通过。
2. issue记录能授权Wildcard证书吗?
若存在 issuewild,wildcard签发按其专门规则处理。应显式检查/配置 issuewild,不要只凭普通证书成功推断。
3. 子域没有CAA是否等于不限制?
不一定。CAA会按规范沿父域查找,父域记录可能约束子域;CNAME也会影响路径。
4. 修改CAA后多久生效?
取决于修改前的 TTL、负缓存和权威同步。新记录TTL不会缩短已缓存旧值,应根据实际剩余时间判断。
5. CAA会让已有证书立刻失效吗?
不会。CAA主要在签发/续期时检查,已有证书验证不因 CAA修改自动失败。
总结
CAA签发失败是 DNS授权链问题,不是 ACME挑战本身。可靠排查要按订单中每个 identifier,检查 issue/issuewild、父域继承、CNAME、子区委派、全部权威、缓存和 DNSSEC,并确认 issuer value与账户参数符合目标 CA官方规则。修复后既要验证目标 CA成功,也要验证未授权 CA仍被拒绝,才能在恢复续期的同时保持最小签发授权面。