DNS CAA 记录及创建方法

请访问原文链接:https://sysin.cn/blog/dns-caa/,查看最新版。原创作品,转载请保留出处。

作者:gc(at)sysin.org,主页:www.sysin.cn

DNS CAA 记录及创建方法

关于 CAA

有一百多个被称为证书颁发机构的组织,可以颁发 SSL 证书来保证您的域的身份。如果您和大多数域所有者一样,您可能只从少数几个证书颁发机构获得证书。CAA(Certificate Authority Authorization,证书颁发机构授权)允许您声明您实际使用的证书颁发机构,禁止其他机构为您的域颁发证书。

以下是您使用 CAA 的一些原因:

  • 您希望降低来自不安全证书颁发机构的风险。您可以使用 CAA 将您的域限制为您信任的证书颁发机构,而您信任这些机构不会颁发未经授权的证书。

  • 您希望阻止员工从未经授权的供应商处获取证书。

设置 CAA 很容易。使用便捷的 CAA 生成器检查您授权的证书颁发机构。然后在域的 DNS 中发布生成的 DNS 记录。您的域需要由支持 CAA 的 DNS 提供商托管。幸运的是,主要的 DNS 提供商现在都支持 CAA。

CAA 是由 RFC 6844 定义的 IETF 标准。自 2017 年 9 月 8 日起,所有公共证书颁发机构都必须遵守 CAA 记录。在为域颁发证书之前,他们必须检查域中的 CAA 记录,如果 CAA 记录集没有授权它们,则拒绝颁发证书。(如果没有 CAA 记录,则允许其发布。)

CAA 和子域

域的 CAA 记录集也适用于所有子域。如果子域有它自己的 CAA 记录集,它将优先。

例如,在证书颁发机构为颁发证书之前 www.example.com 网站,它将按以下顺序查询域中的 CAA 记录集,并使用它找到的第一个记录集:

www.example.com

example.com

CAA 和 CNAME

如果域名创建了 CNAME(也称为别名)指向另外一个域名(CNAME 目标),则证书颁发机构还会在 CNAME 目标以及目标的所有父域中查找 CAA 记录集。如果没有找到 CAA 记录集,证书颁发机构将继续搜索原始域名的父域。

例如,如果 blog.example.com 的 CNAME 记录指向 blog.example.net,则证书颁发机构按以下顺序查找 CAA 记录集:

blog.example.net
example.net
example.com

也就是说自己的域名如果 CNAME 指向了第三方域名(比如常用在 CDN 和智能 DNS),你的域名 CAA 策略由第三方域名 CAA 记录优先决定,如果第三方域名没有 CAA 记录,自己的域名 CAA 策略才完全有效。

当然,这个并不是全局的限制,比如上述 blog.example.com 这个域名要申请 SSL 证书会受到 blog.example.net 及其父域 example.net 的 CAA 策略限制,www.example.com 没有 CNAME 记录并不受此限。

但是,在上述 CNAME 记录存在的情况下,申请通配符证书 *.example.com 情况会怎样?理论上会受到第三方域名 CAA 记录的限制。

局限性

不管 CAA 怎么说,一个恶意或完全被破坏的证书颁发机构都可以为您的域颁发证书。此外,DNS 记录可以被强大的攻击者欺骗,欺骗证书颁发机构认为它已被授权。

然而,在实践中,CAA 可以保护域所有者不受证书颁发机构中最近的许多安全漏洞的影响。尽管存在局限性,发布 CAA 政策是一种非常明智的安全措施。

为了增加保护,请使用证书透明度监视器(如 Cert Spotter)在颁发的证书违反您的 CAA 策略时向您发出警报。

支持 CAA 的 DNS

服务商

主流的域名服务商,国内如 阿里云解析 DNSDSNPOD(腾讯云),国外如 Cloudflare、Azure DNS、AWS Route 53 和 Google Cloud DNS,都可以支持 CAA 记录。

更多厂商列表可以参考这里:https://sslmate.com/caa/support

软件

Software/Provider Support Comments
BIND Yes Prior to version 9.9.6 use RFC 3597 syntax
dnsmasq Yes Use --dns-rr option with hex data
Knot DNS ≥2.2.0
ldns ≥1.6.17
NSD Yes Prior to version 4.0.1 use RFC 3597 syntax
OpenDNSSEC Yes With ldns ≥1.6.17
PowerDNS ≥4.0.0 Versions 4.0.3 and below are buggy when DNSSEC is enabled.
Simple DNS Plus ≥6.0
tinydns Yes Use generic record syntax
Windows Server 2016 Yes Use RFC 3597 syntax

CAA 记录格式

CAA 记录由以下元素组成:

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

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

CAA <flags> <tag> <value>

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

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

创建 CAA 记录

可以使用 https://sslmate.com/caa/ 来生成,示例:

通用(适用于一般 DNS 服务商或者域名注册商)

For Google Cloud DNS, Route 53, DNSimple, and other hosted DNS services

Name        Type  Value
sysin.org.  CAA   0 issue "digicert.com"
                  0 issue "letsencrypt.org"

添加 CAA 记录

  • 记录类型选择 CAA

  • Name 或者主机记录填写 @ 表示*域名,会自动应用到多级域名。

  • 记录值填写 0 issue "证书颁发机构域名"

    如果如果你用 Let's Encrypt 颁发的免费证书,CAA data 部分直接填写 0 issue"letsencrypt.org" 即可。

    允许多个证书颁发机构,添加多条即可。

  • 你还可以添加一条为 0 iodef "mailto: 你的邮箱" 的 CAA 记录,表示如果发现违背 CAA 记录的情况给这个邮箱发邮件通知。

检测方法

dig

# dig sslmate.com caa

; <<>> DiG 9.11.13-RedHat-9.11.13-5.el8_2 <<>> sslmate.com caa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21947
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

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

;; ANSWER SECTION:
sslmate.com.            7200    IN      CAA     0 issue "sectigo.com"
sslmate.com.            7200    IN      CAA     0 issuewild ";"
sslmate.com.            7200    IN      CAA     0 iodef "mailto:security@opsmate.com"
sslmate.com.            7200    IN      CAA     0 issue "letsencrypt.org"

nslookup

注意:Windows 中目前并不支持 type=caa 查询,请在 Unix-Like 系统中使用。

# nslookup
> set type=caa
> sslmate.com
Server:         183.60.83.19
Address:        183.60.83.19#53

Non-authoritative answer:
sslmate.com     rdata_257 = 0 issuewild ";"
sslmate.com     rdata_257 = 0 iodef "mailto:security@opsmate.com"
sslmate.com     rdata_257 = 0 issue "letsencrypt.org"
sslmate.com     rdata_257 = 0 issue "sectigo.com"

Authoritative answers can be found from:

使用 SSL Test 在线检测,会提示:

DNS Certification Authority Authorization (CAA) Policy found for this domain.  MORE INFO »
上一篇:Ubuntu 20.04 设置 DNS 的方法


下一篇:VS2017卡在登录界面问题