什么是CAA记录?
CAA(证书颁发机构授权)记录是指定哪些证书颁发机构(CA)被允许为域签发SSL/TLS证书的DNS记录类型。CAA充当安全控制,防止未授权的证书颁发,即使攻击者破坏CA也是如此。
为什么CAA记录很重要
没有CAA记录,数百个受信任的CA中的任何一个都可以为你的域颁发证书。这会产生风险:
- CA妥协:如果任何受信任的CA被妥协,攻击者可以获得你域名的证书
- 发行错误:CA偶尔会错误地颁发证书
- 社会工程:攻击者可能会欺骗CA颁发未授权证书
CAA记录通过限制可以为你的域颁发的CA来减少攻击面。
CAA如何工作
1. 域所有者发布 DNS中的CAA记录
2. 证书请求者要求CA颁发证书
3. CA检查 CAA记录的域
4. CA仅在授权时发行(或不存在CAA记录)
5. 如果未授权,CA必须拒绝请求
强制CA检查
自2017年9月起,所有CA都必须在颁发证书前检查CAA记录。这是CA/浏览器论坛基线要求的一部分。
CAA记录格式
example.com. IN CAA 0 issue "letsencrypt.org"
组件:
- 0:标志(0=非关键,128=关键)
- issue/issuewild/iodef:属性标签
- "letsencrypt.org":属性值(授权CA)
属性标签
| 标签 | 目的 | 示例 |
|---|---|---|
| issue | 为所有证书授权CA | issue "letsencrypt.org" |
| issuewild | 为通配符证书授权CA | issuewild "digicert.com" |
| iodef | 报告未授权尝试 | iodef "mailto:security@example.com" |
CAA记录示例
单个CA(仅Let's Encrypt)
example.com. CAA 0 issue "letsencrypt.org"
多个CA
example.com. CAA 0 issue "letsencrypt.org"
example.com. CAA 0 issue "digicert.com"
example.com. CAA 0 issue "sectigo.com"
通配符限制
允许Let's Encrypt进行常规证书,DigiCert进行通配符:
example.com. CAA 0 issue "letsencrypt.org"
example.com. CAA 0 issuewild "digicert.com"
拒绝所有(无证书)
用于永远不应该有证书的域:
example.com. CAA 0 issue ";"
带报告
example.com. CAA 0 issue "letsencrypt.org"
example.com. CAA 0 iodef "mailto:security@example.com"
常见CA标识符
| CA | 标识符 |
|---|---|
| Let's Encrypt | letsencrypt.org |
| DigiCert | digicert.com |
| Sectigo(Comodo) | sectigo.com |
| GlobalSign | globalsign.com |
| GoDaddy | godaddy.com |
| Amazon | amazon.com |
| Google信任服务 | pki.goog |
查看你的CA文档获取确切的标识符使用。
实施CAA记录
通过DNS提供商
大多数DNS提供商在其界面中支持CAA记录。
通过区文件
; 允许Let's Encrypt和DigiCert
@ IN CAA 0 issue "letsencrypt.org"
@ IN CAA 0 issue "digicert.com"
@ IN CAA 0 iodef "mailto:security@example.com"
CAA继承
CAA记录遵循DNS层次结构:
- 如果example.com有CAA记录,它们适用于子域
- 子域可以有自己的CAA记录(覆盖父)
- 无CAA记录=任何CA可以颁发
example.com. CAA 0 issue "letsencrypt.org" ; 适用于所有
api.example.com. CAA 0 issue "digicert.com" ; api的覆盖
检查CAA记录
使用dig:dig example.com CAA
; 答案部分:
example.com. 300 IN CAA 0 issue "letsencrypt.org"
使用DomScan:
curl "https://domscan.net/v1/health?domain=example.com"
# 在安全详情中报告hasCAA
CAA最佳实践
1. 始终配置CAA:减少你的攻击面
2. 包含你使用的所有CA:不要忘记CDN/云提供商CA
3. 设置iodef:获得未授权尝试通知
4. 在执行前测试:验证你的CA仍能颁发
5. 保持记录更新:在请求证书前添加新CA
常见CAA问题
证书续期失败:CA不在CAA记录中——在证书过期前添加 CDN证书失败:CDN提供商的CA未授权——检查你的CDN使用哪个CA 缺失子域CAA:子域继承父CAA——如果需要设置特定记录CAA是简单但强大的安全控制,每个域都应该实施。