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>
键名 | 描述 |
---|---|
flag | 0-255 正整数 |
tag | 标识符 RFC 6844 |
value | 键值 |
标识符(tag)目前只有 3 种可用值:
- issue:CA授权任何类型的域名证书(Authorization Entry by Domain)
- issuewild:CA授权通配符域名证书(Authorization Entry by Wildcard Domain)
- iodef:指定CA可报告策略违规(Report incident by IODEF report)
- auth、path和policy:保留标签
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 记录的目标 |
- 如果 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
。
相关链接
参考链接
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2018-07-25 20:01 PM