Cloudflare DNS 和 CAA 记录的注意事项

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2024/01/26/cloudflare-dns-and-caa-records/

我们有部分域名托管在 Cloudflare 上,在之前的一次安全检查中,配置了 CAA 记录,使用 Let’s Encrypt 签发证书时一切正常。 但当我们使用 AWS ACM 签发证书时,却发现证书签发失败了。

问题 #1: CAA 配置错误

那天我在配置 AWS Cloudfront,需要一个特定域名的证书,而这个域名目前托管在 Cloudflare 上。我按照 AWS ACM 的要求, 在 Cloudflare 上配置了对应的 CNAME 验证记录,但是验证失败了。起初我以为是我配置出错了,但是再试了一次,仍然报错。 此时我才注意到上面有一个带着下划线的 Status: Failed,鼠标移上去才能看到完整的错误信息:CAA 记录校验失败。

我当时查看了下 AWS ACM 的文档,发现是 CAA 需要配置 4 个 CA:

  • amazon.com
  • amazontrust.com
  • awstrust.com
  • amazonaws.com

而我之前通过 CAA 生成器生成的 CAA 记录只有 amazon.com,因此(可能)导致了验证失败。

在加上其他 3 个 CA 后,目前 CAA 配置如下:

1example.com. 3600 IN CAA 0 issue "amazon.com"
2example.com. 3600 IN CAA 0 issue "amazontrust.com"
3example.com. 3600 IN CAA 0 issue "awstrust.com"
4example.com. 3600 IN CAA 0 issue "amazonaws.com"
5example.com. 3600 IN CAA 0 issue "letsencrypt.org"
6example.com. 3600 IN CAA 0 iodef "mailto:[email protected]"

但是,当我再次去 AWS ACM 申请证书时,仍然报错了,错误信息仍然是 CAA 记录校验失败。

问题 #2: Cloudflare DNS 自动附加的 CAA 记录

我当时就很奇怪,明明我已经在 Cloudflare 上配置了 CAA 记录,为什么还会报错呢?于是我使用 nslookup 命令查看了下:

 1> set type=CAA
 2> example.com
 3
 4Server:         127.0.0.1
 5Address:        127.0.0.1#53
 6
 7Non-authoritative answer:
 8example.com      rdata_257 = 0 iodef "mailto:[email protected]"
 9example.com      rdata_257 = 0 issue "amazon.com"
10example.com      rdata_257 = 0 issue "amazonaws.com"
11example.com      rdata_257 = 0 issue "amazontrust.com"
12example.com      rdata_257 = 0 issue "awstrust.com"
13example.com      rdata_257 = 0 issue "comodoca.com"
14example.com      rdata_257 = 0 issue "digicert.com; cansignhttpexchanges=yes"
15example.com      rdata_257 = 0 issue "letsencrypt.org"
16example.com      rdata_257 = 0 issue "pki.goog; cansignhttpexchanges=yes"
17example.com      rdata_257 = 0 issuewild "comodoca.com"
18example.com      rdata_257 = 0 issuewild "digicert.com; cansignhttpexchanges=yes"
19example.com      rdata_257 = 0 issuewild "letsencrypt.org"
20example.com      rdata_257 = 0 issuewild "pki.goog; cansignhttpexchanges=yes"
21
22Authoritative answers can be found from:

好家伙……

Cloudflare 为了方便他们的 CDN 服务申请对应域名的证书,会把他们使用的所有 CA 的 CAA 记录自动附加在了所有域名的 DNS 上。

这本无可厚非,可坑爹的是,他明明可以只写 issue 语句,却非要写 issuewild 语句,这样就导致了其他没有写 issuewild 语句的 CA,都被禁止签发泛域名证书了。

如果一个域名的 CAA 记录里只有 issue 语句,没有issuewild 语句,那么表示这个域名允许所有白名单里的 CA 签发普通证书和泛域名证书。 但是只要 issuewildissue 语句混杂着出现,那么每个 CA 就必须要有 issuewild 语句才能签发泛域名证书,必须有 issue 语句才能签发普通证书。

也就是说,本来按照我的配置,我是不限制 CA 签发的证书类型的,但是 Cloudflare 的自动附加的 CAA 记录,却限制了其他几个他不使用的 CA 只能签发普通证书。

补全每一个 CA 的 issuewild 语句后,再次去 AWS ACM 申请证书,终于成功了。

comments powered by Disqus