2021-12-08 更新:修正一些细节描述。
关于 CAA
有一百多个被称为证书颁发机构的组织,可以颁发 SSL 证书来保证您的域的身份。如果您和大多数域所有者一样,您可能只从少数几个证书颁发机构获得证书。CAA(Certificate Authority Authorization,证书颁发机构授权)允许您声明您实际使用的证书颁发机构,禁止其他机构为您的域颁发证书。
以下是您使用 CAA 的一些原因:
-
您希望降低来自不安全证书颁发机构的风险。您可以使用 CAA 将您的域限制为您信任的证书颁发机构,而您信任这些机构不会颁发未经授权的证书。
-
您希望阻止员工从未经授权的供应商处获取证书。
设置 CAA 很容易。使用便捷的 CAA 生成器检查您授权的证书颁发机构。然后在域的 DNS 中发布生成的 DNS 记录 (sysin)。您的域需要由支持 CAA 的 DNS 分享商托管。幸运的是,主要的 DNS 分享商现在都支持 CAA。
CAA 是由 RFC 6844 定义的 IETF 标准。自 2017 年 9 月 8 日起,所有公共证书颁发机构都必须遵守 CAA 记录。在为域颁发证书之前,他们必须检查域中的 CAA 记录,如果 CAA 记录集没有授权它们,则拒绝颁发证书。(如果没有 CAA 记录,则允许其发布。)
CAA 和子域
域的 CAA 记录集也适用于所有子域。如果子域有它自己的 CAA 记录集,它将优先。
例如,在证书颁发机构为颁发证书之前 www.sysin.org 网站,它将按以下顺序查询域中的 CAA 记录集,并使用它找到的第一个记录集:
CAA 和 CNAME
如果域名创建了 CNAME(也称为别名)指向另外一个域名(CNAME 目标),则证书颁发机构还会在 CNAME 目标以及目标的所有父域中查找 CAA 记录集。如果没有找到 CAA 记录集,证书颁发机构将继续搜索原始域名的父域。
例如,如果 blog.sysin.org 的 CNAME 记录指向 blog.example.net,则证书颁发机构按以下顺序查找 CAA 记录集:
1 | blog.example.net |
也就是说自己的域名如果 CNAME 指向了第三方域名(比如常用在 CDN 和智能 DNS),你的域名 CAA 策略由第三方域名 CAA 记录优先决定,如果第三方域名没有 CAA 记录,自己的域名 CAA 策略才完全有效。
当然,这个并不是全局的限制,比如上述 blog.sysin.org 这个域名要申请 SSL 证书会受到 blog.example.net 及其父域 example.net 的 CAA 策略限制,www.sysin.org 没有 CNAME 记录并不受此限。
但是,在上述 CNAME 记录存在的情况下,申请通配符证书 *.sysin.org
情况会怎样?理论上会受到第三方域名 CAA 记录的限制。
局限性
不管 CAA 怎么说,一个恶意或完全被破坏的证书颁发机构都可以为您的域颁发证书。此外,DNS 记录可以被强大的攻击者欺骗,欺骗证书颁发机构认为它已被授权。
然而,在实践中,CAA 可以保护域所有者不受证书颁发机构中最近的许多安全漏洞的影响。尽管存在局限性 (sysin),发布 CAA 政策是一种非常明智的安全措施。
为了增加保护,请使用证书透明度监视器(如 Cert Spotter)在颁发的证书违反您的 CAA 策略时向您发出警报。
支持 CAA 的 DNS
服务商
主流的域名服务商,国内如 阿里云解析 DNS 和 DSNPOD(腾讯云),国外如 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 记录的规范的表示法是:
1 | CAA |
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
1 | Name Type Value |
添加 CAA 记录 (sysin)
-
记录类型选择 CAA
-
Name 或者主机记录填写 @ 表示顶级域名,会自动应用到多级域名。
-
记录值填写
0 issue "证书颁发机构域名"
。如果如果你用 Let’s Encrypt 颁发的免费证书,
CAA data
部分直接填写0 issue"letsencrypt.org"
即可。允许多个证书颁发机构,添加多条即可。
-
你还可以添加一条为
0 iodef "mailto: 你的邮箱"
的 CAA 记录,表示如果发现违背 CAA 记录的情况给这个邮箱发邮件通知。
检测方法
dig
1 | dig sslmate.com caa |
nslookup
注意:Windows 中目前并不支持 type=caa 查询,请在 Unix-Like 系统中使用。
1 | nslookup |
使用 SSL Test 在线检测,会提示:
1 | DNS Certification Authority Authorization (CAA) Policy found for this domain. MORE INFO » |
下载仅供下载体验和测试学习,不得商用和正当使用。
下载体验