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 配置示例
| Type | Host / Name | Value / Points to | TTL |
|---|---|---|---|
| CAA | @ | 0 issue "letsencrypt.org" | 3600 |
| CAA | @ | 0 issuewild "digicert.com" | 3600 |
| CAA | @ | 0 iodef "mailto:security@example.com" | 3600 |
| CAA | no-ssl | 0 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 证书的子域名或内部域名很有用。