网络入门之 DNS CAA 记录
后知后觉 暂无评论

CAA(Certificate Authority Authorization,证书颁发机构授权)记录用于指定允许哪些证书颁发机构(CA)为域颁发证书。

证书颁发机构授权记录为了改善PKI(Public Key Infrastructure:公钥基础设施)生态系统强度、减少证书意外错误发布的风险,通过DNS机制创建CAA资源记录,从而限定了特定域名颁发的证书和CA(证书颁发机构)之间的联系。从此,再也不能是任意CA都可以为任意域名颁发证书了。

关于CAA记录,其实早在4年前便在 RFC 6844 中有定义,但由于种种原因配置该DNS资源记录的网站寥寥无几。如今,SSL证书在颁发之前对域名强制CAA检查,就对想要https访问的网站域名提出了解析配置的要求。

CAA 规范

CAA 记录构成

一条标准的 CAA 记录由三个元素组成

CAA <flags> <tag> <value>

键名描述
flag0-255 正整数
tag标识符 RFC 6844
value键值

标识符(tag)目前只有 3 种可用值:

CAA 示例

$ dig google.com caa

; <<>> DiG 9.10.3-P4-Debian <<>> google.com caa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4987
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com.            IN    CAA

;; ANSWER SECTION:
google.com.        21599    IN    CAA    0 issue "pki.goog"

;; Query time: 38 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Jul 25 20:30:47 PDT 2018
;; MSG SIZE  rcvd: 66
注意:在部分旧版的 dig 上无法查询 CAA 记录,请指定为 type257 。

CAA 查询

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

名称含义
CAA(X)查询标签 X 返回的结果
P(X)是 DNS 层次结构中位于 X 之上的 DNS 标签
A(X)在标签 X 处指定的 CNAME 或 DNAME 记录的目标

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

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

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

举例说明:例如,如果想要限制颁发 example.comLet’s Encrypt 证书颁发机构的 SSL 证书,应该添加以下 CAA 记录:

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

如果想允许 Let’s EncryptComodo,则应该添加 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

相关链接

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。