帮助中心 >
  关于网络安全 >
  CAA记录有什么用?防止SSL证书被错误签发的安全配置

CAA记录有什么用?防止SSL证书被错误签发的安全配置

时间 : 2026-09-02 15:28:05
编辑 : DNS.COM

  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控制台,添加记录

  1. 找到域名的解析设置页面
  2. 点击“添加记录”
  3. 记录类型选择CAA
  4. 主机记录:@表示主域名;如果要给子域名单独设置,填子域名前缀(如api)
  5. 记录值:按照flag tag value格式填写
  6. 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。

  解决办法就两条路:

  1. 在DNS里添加一条该CA的授权记录
  2. 切换到已在白名单里的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。这是投入产出比极高的一层安全防护,关键是,它几乎不花什么成本。

DNS Anna
DNS Amy
DNS NOC
标题
电子邮件地址
类型
信息
验证码
提交