域名 CAA 记录配置:只允许指定 CA 为网站签发 SSL 证书

网站一直在正常访问,某天却接到用户反馈浏览器弹出证书告警,排查后发现是域名被另一个证书颁发机构(CA,Certificate Authority)误签了证书——这类问题遇到的概率不高,但一旦发生处理起来非常被动。CAA(Certificate Authority Authorization,证书颁发机构授权)记录就是用来解决这个隐患的:它在 DNS(Domain Name System,域名解析系统)里声明”只允许哪些 CA 为我的域名签发 SSL(Secure Sockets Layer,安全传输协议)证书”,从源头上收窄签发权限。这篇文章讲清 CAA 记录的三个标签怎么用、怎么在 DNS 平台配置、怎么验证生效,以及续期失败怎么排查,看完就能直接给生产域名加上这道防线。

CAA 记录核心概念封面图

CAA 记录是怎么拦住”不该签的证书”的

CAA 记录本质上是一条普通的 DNS 记录,但它承载的是一条签发策略声明。按照 RFC 8659 的约定,证书颁发机构在收到签发请求后,必须先查询目标域名的 CAA 记录:如果记录里声明的允许列表里没有自己,就必须拒绝签发并把这次请求记录在审计日志里;如果域名没有配置任何 CAA 记录,则默认任何 CA 都可以签发。换句话说,CAA 把”谁能给我的域名发证书”这个决定权收回到域名所有者手里。

一条完整的 CAA 记录由三个字段组成:标志位(flags,通常是 0)、标签(tag)和值(value)。真正干活的是标签,共有三个:

  • issue:声明允许为该域名签发普通证书的 CA 域名
  • issuewild:单独控制通配符证书(如 *.example.com)的签发权限
  • iodef:指定违规签发行为的报告接收地址,方便第一时间发现异常

还有一个容易被忽略的细节是继承规则:CAA 记录会沿 DNS 树向下继承。sub.example.com 没有自己的 CAA 记录时,签发沿用 example.com 的策略;一旦子域配置了自己的记录,就完全覆盖父域。

配置前的准备:确认你的 CA 域名

动手配置之前,先确认一件最关键的事:当前证书是由哪家 CA 签发的,以及这家 CA 在 CAA 体系里登记的域名。写错 CA 域名是 CAA 配置事故的头号来源——记录一生效,下一次证书续期就会被直接拒绝,网站在无人察觉的情况下证书过期。

各主流 CA 的登记域名:免费的 Let’s Encrypt 使用 letsencrypt.org;DigiCert 使用 digicert.com;Sectigo 使用 sectigo.com;GlobalSign 使用 globalsign.com。如果不确定证书来自哪家,可以在浏览器里点开站点证书详情查看签发机构,或者在服务器上用 OpenSSL 命令查看:

# 查看当前站点证书的签发机构(把域名换成自己的)
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -issuer

# 用 dig 查询域名现有的 CAA 记录(可能为空,为空表示尚未配置)
dig example.com CAA +short

另外要提前想清楚两个问题:一是是否使用或计划使用通配符证书,如果答案是肯定的,就必须同时写 issuewild,否则通配符续期会被拦下;二是是否托管在共享主机上由主机商统一管理证书——这种情况下要先问清主机商用的是哪家 CA,再决定允许列表,避免单方面收紧后把主机商的自动签发流程卡死。部署形态不同,证书管理方式也不同,可以参考这篇虚拟主机 SSL 证书部署后强制 HTTPS:301 跳转与混合内容修复提前了解。

三种场景下的 CAA 记录配置方法

配置入口在域名解析服务商的管理后台:进入对应域名的解析记录页,添加记录时把记录类型选为 CAA,填写主机名、标志位、标签和值即可。不同服务商界面略有差异,但字段含义一致,下面按三个典型场景给出可以直接套用的配置。

场景一:单一 CA,最简单的收紧。 假设你的站点只用 Let’s Encrypt 签发,只需添加两条记录——一条管普通证书,一条管违规报告:

example.com.  CAA  0 issue "letsencrypt.org"
example.com.  CAA  0 iodef "mailto:security@example.com"

注意 value 必须用英文双引号包住 CA 域名,很多控制台会帮你自动补引号,但用 API 或 zone 文件直接编辑时容易漏掉。

场景二:允许多家 CA 并存。 如果主站用商业证书、子域测试环境用 Let’s Encrypt,可以并列多条 issue 记录。签发机构在检查时只要满足其中任意一条即可通过:

example.com.  CAA  0 issue "digicert.com"
example.com.  CAA  0 issue "letsencrypt.org"
example.com.  CAA  0 iodef "mailto:security@example.com"

场景三:需要通配符证书,且和普通证书用同一家 CA。 如果不写任何 issuewild 记录,通配符签发会沿用 issue 列表;但如果写了 issuewild,通配符证书就只看 issuewild,issue 对它失效。明确写出更稳妥:

example.com.  CAA  0 issue "letsencrypt.org"
example.com.  CAA  0 issuewild "letsencrypt.org"
example.com.  CAA  0 iodef "mailto:security@example.com"

反过来,如果你想把通配符彻底关掉(不少安全团队会这么做,因为通配符证书一旦泄露影响面最大),可以写一条指向空值的 issuewild:example.com. CAA 0 issuewild ";"。

CAA 配置前后对比示意图

配置后如何验证生效

记录保存后不要想当然认为已经生效,按三步验证:先用 dig 确认权威解析返回记录;再用在线 CAA 检测工具交叉确认;最后用一次真实签发或续期做端到端验证。

# 验证 CAA 记录已生效,应返回配置的三条记录
dig example.com CAA +short

# 指定权威服务器查询,排除本地缓存干扰
dig @ns1.your-dns-provider.com example.com CAA +short

验证时有两个时间因素要留意:一是 DNS 缓存,新记录的全球生效速度取决于 TTL(Time To Live,DNS 记录缓存有效期);二是证书颁发机构内部的策略缓存,个别 CA 会缓存 CAA 查询结果最长 8 小时。如果紧接着就要续期,建议先把 TTL 设短一些(如 300 秒),确认签发正常后再调回。

iodef 的报告通道也可以顺手验证:这条标签支持 mailto: 和 http: 两种格式,CA 遇到被拒绝的签发请求时会向这个地址发报告。配置一个确实能收信的邮箱,才不会在出事时错过警报。

CAA 记录签发拦截流程示意

证书续期突然失败?先查这三处

CAA 配置最常见的翻车现场是”配完没管,几个月后续期集体失败”。按下面顺序排查,通常几分钟内能定位:

  1. 先看续期日志里的报错关键词。Let’s Encrypt 的报错会直接包含 CAA 字样并写明是哪个 CA 域名不匹配;商业 CA 的报错措辞不同,但同样会说明签发被策略拒绝。
  2. 核对记录里的 CA 域名和实际签发方是否一致。重点检查三处:CA 自己有没有换登记域名(历史上发生过)、你是否用 ACME(Automated Certificate Management Environment,自动化证书管理环境)客户端走了中间商服务、续期是否新引入了通配符而 issuewild 没跟上。
    还有一种情况要留意:子域覆盖。如果失败的证书挂在某个子域上,用 dig 子域 CAA +short 确认它是否意外配置了自己的 CAA 记录,覆盖掉父域放开的权限。

排查期间如果线上证书即将到期,先临时把当前签发方的域名加回 CAA 记录恢复签发,等证书续上再收紧列表——CAA 是 DNS 记录,通常不超过一个 TTL 周期就会生效。续期监控和到期告警属于另一条线,参考这篇 Certbot 证书自动续期排障:服务器 SSL 部署与续期验证分开管好。

多域名和批量站点场景的管理建议

域名数量一多,CAA 就从”一次性配置”变成”需要管理的资产”,几个实践被反复验证有效:

  • 把每个域名的 CAA 配置写进基础设施代码仓库(如 zone 文件或 Terraform 模块),和服务器配置一起走变更流程,避免只在 DNS 控制台上”顺手改”
  • 每季度用 dig 批量巡检全部域名的 CAA 记录,核对允许列表与实际在用的 CA 是否一致;出现”记录里没有但实际在用”的 CA,就是下次续期事故的预告
  • iodef 邮箱接到报告后当安全事件处理:查清是哪个 CA、哪个账号发起的签发请求,确认不是自己团队的操作后再考虑进一步措施

如果你的站点部署在独立服务器或 VPS(Virtual Private Server,虚拟专用服务器)上、证书由自己签发管理,CAA 和服务器侧的安全基线应该一起做,可以搭配这份服务器安全加固清单:从登录入口到内核参数逐项过一遍。域名解析层面的其它防护(如 DNSSEC 签名验证)属于另一条防线,操作方法见这篇DNSSEC 部署:给域名解析加上签名验证。

总结

CAA 记录取回的是证书签发的授权权:三条记录、三个标签,就能把”谁能为我的域名签发 SSL 证书”限定成一张明确的白名单。配置只要几分钟,关键是配置前确认 CA 域名、配置后验证生效、并把它纳入季度巡检。如果你需要托管环境下的证书与安全一体化方案,可以考虑 Hostease 虚拟主机,cPanel 面板集成 SSL/TLS Status 管理,证书安装与续期在后台一键完成;自运维场景则推荐 Hostease VPS,配合 Let’s Encrypt 自动续期把整条证书生命周期管起来。建议今天就给自己的主域名加上 CAA 记录——这是一项典型的”现在花 5 分钟,避免将来排障一整天”的配置。

发表评论