CAA记录有什么用?防止SSL证书被错误签发的安全配置
CAA记录是一种DNS记录,它的作用只有一个:告诉全世界的CA机构,谁有资格给我的域名签发SSL证书。默认情况下,全球上百家CA机构,只要通过了域名验证(比如验证你拥有域名的控制权),就可以为你域名签发证书。这意味着,如果这上百家里有任何一家的验证流程出了漏洞,你的域名就有可能被错误地签发证书。CAA相当于在你家门口贴了一张“白名单”,不在名单上的CA一律不准进。
从2017年9月8日起,所有CA机构在签发证书前都必须强制检查CAA记录。 这是一个行业硬性规定,不是可选项。
CAA记录长什么样?
CAA记录的格式是三段式:[flag] [tag] [value]。
翻成白话:
| 字段 | 含义 | 常见取值 |
| flag | 标志位,控制CA遇到不识别的指令时怎么处理 | 0(忽略不识别的指令)或128(必须理解,否则拒绝签发) |
| tag | 指令类型 | issue(授权普通证书)、issuewild(授权通配符证书)、iodef(违规通知) |
| value | 具体授权对象 | CA的域名,或接收违规通知的邮箱/URL |
三个tag分别怎么用
1. issue——最常用
指定哪家CA可以签证书。填的是CA的域名标识。
0 issue "letsencrypt.org"
上面这条记录的意思:只允许Let's Encrypt为这个域名签发证书,其他CA一概不准。
如果需要授权多家CA,就加多条记录:
0 issue "letsencrypt.org"
0 issue "sectigo.com"
2. issuewild——专门管通配符证书
通配符证书(*.你的域名.com)权力比较大,一张证书能覆盖所有子域名。如果你想对通配符证书做单独限制,就用这个tag。
0 issuewild "sectigo.com"
意思是:只有Sectigo可以为我签发通配符证书。
注意: 如果没有配置issuewild,CA会沿用issue的授权规则。只有当你需要为通配符和非通配符设置不同CA时,才需要单独配置。
3. iodef——违规通知
如果有人未经授权尝试给你的域名申请证书,CA可以按照这个地址给你发警报。
0 iodef "mailto:admin@你的域名.com"
支持邮箱,也支持HTTP/HTTPS的URL端点。这个配置跟白名单记录通常是搭配使用的。
CAA记录放在哪:父子域名的继承逻辑
CAA记录是“看最近的”。CA在检查时,会从你要申请证书的域名开始,逐级向上查找,找到第一条CAA记录就停下来。
举个例子:
你在example.com配置了CAA,只允许Let's Encrypt
然后有人想给api.example.com申请Sectigo的证书
CA的检查路径是:api.example.com → 没找到 → example.com → 找到,允许Let's Encrypt,拒绝Sectigo。
如果你想给api.example.com单独授权另一家CA,直接在子域名上加CAA记录就行,子域名的记录会覆盖父域名的。
特别注意CNAME的情况: 如果api.example.com做了CNAME指向api.cdn.com,CA会直接去查api.cdn.com的CAA记录,不再查api.example.com本身。因为CNAME记录优先级最高,域名一旦设置了CNAME,其他记录都不能共存。
如何添加CAA记录?
实际操作不复杂,但有几个细节要注意。
第一步:确认你的DNS服务商支持CAA
大部分主流DNS服务商都支持了,如果你的服务商还不支持,可能需要考虑换个DNS托管。
第二步:登录DNS控制台,添加记录
- 找到域名的解析设置页面
- 点击“添加记录”
- 记录类型选择CAA
- 主机记录:@表示主域名;如果要给子域名单独设置,填子域名前缀(如api)
- 记录值:按照flag tag value格式填写
- TTL默认600秒即可
第三步:等待生效并验证
添加后等几分钟到几十分钟,用dig命令验证:
dig 你的域名 CAA
返回结果示例:
;; ANSWER SECTION:
example.com. 600 IN CAA 0 issue "letsencrypt.org"
example.com. 600 IN CAA 0 iodef "mailto:security@example.com"
如果返回空结果且没有错误,说明当前域名没有配置CAA记录(即“允许所有CA”)。
关于“CAA未授权”报错
申请SSL证书时如果遇到“CAA unauthorized”之类错误,原因很简单:你的域名当前配置的CAA白名单里,不包含你现在申请的这家CA。
解决办法就两条路:
- 在DNS里添加一条该CA的授权记录
- 切换到已在白名单里的CA重新申请
等DNS生效后重新提交订单就行。
关于CAA查询失败的说明
如果CA查不到CAA记录,会产生什么样的结果?答案可能会让你有点意外:查不到CAA记录,就等于“允许所有CA”。CAA的设计逻辑是“默认放行,显式拒绝”的——如果你不主动设置限制,那CA就默认你有授权。
但如果查询过程中出现SERVFAIL等DNS错误,CA无法确定到底是没有记录还是查不到,通常会拒绝签发作为一种安全保守策略。
常见误区
误区一:CAA是强制规定的,所以我什么都不用管
CAA是CA机构的强制检查义务,但域名所有者如果不主动设置CAA记录,就等于“授权所有CA”,并不会自动保护你。
误区二:CAA能防止我的私钥泄露或被暴力破解
不能。CAA只管“谁有资格签发证书”,不管“你的私钥安不安全”。它解决的是外部CA误发证书的问题,不解决服务器自身安全问题。
误区三:有了CAA证书就绝对安全了
CAA只是增加了一层保护,它降低了“CA被攻破”这个链条的风险。如果CA本身被攻破或流程出问题,CAA不能完全防止。但它至少能做到:即使某家CA出事了,只要我没授权它,它就动不了我的域名。
一句话建议: 如果你在用HTTPS,花两分钟给你的主域名加一条CAA记录——只放行你实际在用的那家CA。这是投入产出比极高的一层安全防护,关键是,它几乎不花什么成本。
CN
EN