自 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:[email protected]"
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:[email protected]"
如前所述,记录是由子主机名继承的。我们来看一个子域配置的例子:
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
。
相关工具
- myssl:如果你想查看某个域名是否添加 CAA 记录,你可以到这里检测(实现链式的查询)。
- sslmate:CAA 记录自助生成,如果你不知道 CAA 记录是什么样,你可以在这里生成,然后添加到你的 DNS 上。
FAQ
1、为什么我添加的 CAA 记录没有生效?
检查域名是否添加 CNAME。按照 RFC 文档来说,CNAME 是不能与其它任何记录同时存在的,但有些 DNS 服务商自己实现的 DNS 服务器并没有遵守这项规则,导致一些记录不生效。
2、有哪些支持 CAA 记录的 DNS 服务商?
到 2018 年,已经有非常多的 DNS 服务商支持 CAA 记录:
本文链接:https://deepzz.com/post/what-is-caa-record-in-dns.html,参与评论 »
--EOF--
发表于 2018-02-04 13:58:00,并被添加「dns、caa、rfc6844」标签。
本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。更多说明 »
提醒:本文最后更新于 2482 天前,文中所描述的信息可能已发生改变,请谨慎使用。
专题「DNS 一站到家」的其它文章 »
- DNS 一站到家之 DNS 消息协议 (May 13, 2017)
- DNS 一站到家之常用工具 (Apr 13, 2017)
- DNS 一站到家之记录类型 (Apr 10, 2017)
- DNS 一站到家之历史由来 (Apr 04, 2017)
Comments