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

关于 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 目标以及目标的所有父域中查找 CAA 记录集。如果没有找到 CAA 记录集,证书颁发机构将继续搜索原始域名的父域。

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

blog.example.net

example.net

example.com

局限性

不管 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   

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

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

创建 CAA 记录

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

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:[email protected]"
sslmate.com.            7200    IN      CAA     0 issue "letsencrypt.org"

nslookup

# 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:[email protected]"
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 »