DNS 一站到家之 CAA 记录

自 2017.04 CAB 论坛通过投票决定:2017.09.08 起,所有 CA 机构颁发 SSL 证书前必须对颁发的域名进行 CAA 检测。CAA 就时不时出现在技术人员的眼前。那么 CAA 记录是什么?又有什么作用呢?如何添加 CAA 记录?

什么是 CAA

CAA(Certification Authority Authorization)是一种 DNS 记录,它被定义在 RFC6844,其目的是用来指定域名允许哪个证书颁发机构(CA)为其颁发证书。防止钓鱼攻击者使用该域名申请 SSL 证书。

它们还提供了一种方法来指示通知规则,以防有人从未经授权的 CA 颁发证书。在没有 CAA 记录的情况下,所有 CA 均可为该域名颁发证书。当然如果存在 CAA 记录,CA 必须遵守规则,只能是在记录列表中的 CA 才被允许。

CAA记录可以为整个域或特定主机名设置策略。CAA 记录也被子域继承,因此 CAA 记录集 example.com 也将适用于任何子域,例如 subdomain.example.com(除非被覆盖)。CAA 记录可以控制发行单域名证书,通配符证书或同时。

CAA 记录格式

CAA 记录由以下元素组成:

标签 描述
flag 0-255 之间的无符号整数
tag 用来表示关键标志,RFC 有定义
value 与 tag 关联的值

CAA 记录的规范的表示法是:

CAA <flags> <tag> <value>

RFC 目前定义了 3 个可用的 tag:

  • issue:明确授权单个证书颁发机构颁发主机名的证书(任何类型)。
  • issuewild:明确授权单个证书颁发机构为主机名颁发通配符证书(只有通配符)。
  • iodef:指定认证机构可以向其报告策略违规的URL或邮箱。

我们先来尝试看看 CAA 到底是什么样的:

$ dig dnsimple.com caa 

; <<>> DiG 9.11.2 <<>> dnsimple.com caa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26969
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;dnsimple.com.          IN  CAA

;; ANSWER SECTION:
dnsimple.com.       3600    IN  CAA 0 issue "amazonaws.com"
dnsimple.com.       3600    IN  CAA 0 issue "comodoca.com"
dnsimple.com.       3600    IN  CAA 0 iodef "mailto:ops@dnsimple.com"
dnsimple.com.       3600    IN  CAA 0 issue "letsencrypt.org"
dnsimple.com.       3600    IN  CAA 0 issuewild "comodoca.com"

;; Query time: 176 msec
;; SERVER: 223.5.5.5#53(223.5.5.5)
;; WHEN: Sun Feb 04 13:18:35 CST 2018
;; MSG SIZE  rcvd: 204

请注意这里的 dig 的版本,较低的版本是不支持 CAA 记录的查询的,请悉知。另外,dig 是不支持继承的查询方式。

查询规则

通过查看 CAB 论坛的帖子来看,他们清晰的定义了 CAA 记录的查询规则,具体如下:

名称 含义
CAA(X) 查询标签 X 返回的结果。
P(X) 是 DNS 层次结构中位于 X 之上的 DNS 标签。
A(X) 在标签 X 处指定的 CNAME 或 DNAME 记录的目标。
  • 如果 CAA(X) 不为空,则 R(X) = CAA(X),否则
  • 如果 A(X) 不为空,并且 CAA( A(X) ) 不为空,那么 R(X) = CAA( A(X) ),否则
  • 如果 X 不是顶级域名,那么 R(X) = R( P(X) ),否则
  • R(X) 为空

因此,当节点处的搜索返回 CNAME 记录时,CA 将沿着 CNAME 记录链到达其目标。如果目标标签含 CAA 记录,则返回。否则,CA 继续在节点 X 的父节点处进行搜索。

注意,搜索不包括 CNAME 记录的目标的父级(除非 CNAME 指向自己的路径)。

为了防止资源耗尽攻击,CA 应该限制被接受的 CNAME 链的长度。但 CA 必须处理包含 8 个或更少的 CNAME 记录的 CNAME 链。

这里举例说明。例如,如果我们想要限制颁发 example.com 给 Let’s Encrypt 证书颁发机构的 SSL 证书,我们应该添加以下 CAA 记录:

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

如果我们想允许 Let’s Encrypt 和 Comodo,我们应该添加 2 个 CAA 记录,每个 CA 记录一个:

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

如果我们想让 Let’s Encrypt 并且 Comodo 只用于通配符,那么我们可以使用 issuewild

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

请注意,issuewild 的存在将覆盖 issue。因此,Let’s Encrypt 不允许发出通配符证书(不管他们不支持这种类型的证书)。

最后,要获得违反政策的通知,您可以添加一个带有 iodef 标记的记录,其中包含要通知的电子邮件地址:

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

如前所述,记录是由子主机名继承的。我们来看一个子域配置的例子:

example.com.        CAA 0 issue "letsencrypt.org"
alpha.example.com.  CAA 0 issue "comodoca.com"
beta.example.com.   CAA 0 issue "letsencrypt.org"
beta.example.com.   CAA 0 issue "comodoca.com"

在上面的示例中,Let’s Encrypt 是 example.com 域的默认 CA。但是,只有 Comodo 才能颁发证书 alpha.example.com。Comodo 和 Let’s Encrypt 都可以颁发证书 beta.example.com。那么 foo.example.com 呢?因为没有记录存在 foo.example.com,但有一个记录 example.com,在这种情况下,只有 Let’s Encrypt 将被允许发出 foo.example.com

相关工具

  1. myssl:如果你想查看某个域名是否添加 CAA 记录,你可以到这里检测(实现链式的查询)。
  2. sslmate:CAA 记录自助生成,如果你不知道 CAA 记录是什么样,你可以在这里生成,然后添加到你的 DNS 上。

FAQ

1、为什么我添加的 CAA 记录没有生效?
检查域名是否添加 CNAME。按照 RFC 文档来说,CNAME 是不能与其它任何记录同时存在的,但有些 DNS 服务商自己实现的 DNS 服务器并没有遵守这项规则,导致一些记录不生效。

2、有哪些支持 CAA 记录的 DNS 服务商?
到 2018 年,已经有非常多的 DNS 服务商支持 CAA 记录:

本文链接:参与评论 »

--EOF--

提醒:本文最后更新于 198 天前,文中所描述的信息可能已发生改变,请谨慎使用。

专题「DNS 一站到家」的其它文章 »

Comments