1

DNS 一站到家之 CAA 记录

 3 years ago
source link: https://deepzz.com/post/what-is-caa-record-in-dns.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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:[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

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

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,并被添加「dnscaarfc6844」标签。

本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。更多说明 »

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK