CAA 记录

DNS 证书颁发机构授权(CAA)记录是一种 DNS 资源记录类型,允许域名所有者明确声明哪些证书颁发机构(CA)有权为其域名或特定主机名颁发 SSL/TLS 证书。它作为一种安全策略机制,为防止未经授权的证书颁发提供了额外的保护层。

How it works

默认情况下,每个公共证书颁发机构都被允许为公共 DNS 中的任何域名颁发证书,只要它们验证了对该域名的控制权。CAA 记录通过允许域名所有者创建授权 CA 的白名单来改变这一点,防止证书被错误颁发,否则这些证书可能被用于钓鱼或中间人攻击等恶意活动。

当证书颁发机构收到颁发证书的请求时,它必须执行 CAA 资源记录的 DNS 查询。如果找到任何 CAA 记录,CA 必须确保它在至少一条记录中被列为授权方,然后才能继续颁发证书。 该流程如下: 1. 有人从 CA 请求您域名的 SSL/TLS 证书 2. CA 对您的域名执行 CAA 记录的 DNS 查询 3. 如果在子域名上没有找到 CAA 记录,CA 会按层次检查父域名 4. 如果存在 CAA 记录,CA 检查自己是否被列为授权方 5. 如果获得授权,CA 继续颁发证书;否则,必须拒绝 CAA 记录包括标志、标签和值。标志(通常为 0)表示该属性的重要程度。标签-值对构成一个指定授权规则的属性。

Key Points

  • CAA 记录防止未经授权的 CA 为您的域名颁发证书
  • 行业标准要求证书颁发机构在颁发证书前必须检查 CAA 记录
  • CAA 记录按层次检查 - 如果在子域名上未找到,则检查父域名
  • 记录格式为:flags tag "value"(例如,0 issue "letsencrypt.org"
  • CAA 于 2019 年通过 RFC 8659 和 RFC 8657 标准化,是一种相对现代的安全机制

Common Use Cases

  • 证书颁发机构白名单: 明确授权仅特定的 CA(如 Let's Encrypt 或 DigiCert)可以为您的域名颁发证书,阻止所有其他 CA
  • 通配符证书控制: 使用 issuewild 标签为通配符证书和普通证书指定不同的授权规则
  • 安全事件报告: 使用 iodef 标签指定一个 URL,CA 可以在该地址报告有关未经授权的证书请求的安全策略违规情况
  • 子域名特定授权: 为不同的子域名设置不同的 CAA 策略,从而对整个基础设施的证书颁发实施更严格的控制

code 配置示例

TypeHost / NameValue / Points toTTL
CAA@0 issue "letsencrypt.org"3600
CAA@0 issuewild "digicert.com"3600
CAA@0 iodef "mailto:security@example.com"3600
CAAno-ssl0 issue ";"3600

* CAA 记录指定哪些证书颁发机构可以颁发证书。标志通常为 0,常见的标签有 'issue'、'issuewild' 和 'iodef'。

Frequently Asked Questions

证书颁发机构是否必须检查 CAA 记录?expand_more
是的。自 2017 年 9 月起,CA/浏览器论坛基线要求规定,所有证书颁发机构在颁发证书之前都必须检查 CAA 记录。如果存在 CAA 记录且该 CA 未被列为授权方,CA 必须拒绝颁发证书。这使得 CAA 记录成为一种有效的安全机制。
如果我没有 CAA 记录会怎么样?expand_more
如果您没有 CAA 记录,任何证书颁发机构都可以为您的域名颁发证书(需遵守其自身的验证流程)。这是默认行为。虽然没有 CAA 记录不会使您的域名不安全,但添加一条 CAA 记录可以为防止未经授权的证书颁发提供额外的保护层。
如何允许多个证书颁发机构?expand_more
您可以在 DNS 区域中添加多条 CAA 记录,每个您想要授权的证书颁发机构一条。例如,您可能有一条用于 Let's Encrypt 的记录和另一条用于 DigiCert 的记录。只要 CA 找到至少一条授权它的 CAA 记录,就可以继续颁发证书。
CAA 记录中的标志值是什么意思?expand_more
标志是一个数字(通常为 0),表示该属性的重要程度。标志为 0 表示该属性是非关键的。标志为 128("颁发者关键"标志)表示如果 CA 不理解该属性标签,则必须拒绝颁发证书。实际上,大多数 CAA 记录使用标志值 0。
我可以阻止为某个域名颁发所有证书吗?expand_more
可以。您可以创建一条值为空(仅分号)的 CAA 记录,如 0 issue ";",这会告诉所有 CA,没有人被授权为该域名颁发证书。这对于您永远不希望颁发 SSL/TLS 证书的子域名或内部域名很有用。