CAA 记录阻挡 SSL 证书签发:3 个原因 + 修复路径

域名指了 Vercel / Cloudflare,证书一直不发——CAA 限定了允许的 CA。

你在 Vercel / Cloudflare / 新主机绑了自定义域名。DNS 正确,无代理,但 SSL 证书签发无限期挂起。平台日志(看得到的话)里报类似 “CAA record prohibits issuance” 的错。你的域名上有之前某次 CA 设置遗留的 CAA 记录,那个 CAA 只允许特定 CA 签发。新平台用别的 CA 就静默失败。CAA 是 DNS 排错里最隐蔽的原因之一——大多数人遇到这个之前甚至不知道自己有 CAA 记录。

常见原因

按命中率从高到低。

1. CAA 只允许特定 CA

你几个月前为安全设过 CAA(0 issue "letsencrypt.org")——意味着只有 Let’s Encrypt 能签发。现在你换到了用 Google Trust Services 或 Sectigo 的主机。它们签不了。

怎么判断

dig CAA yourdomain.com

限制性 CAA 例子:

0 issue "letsencrypt.org"
0 issue "digicert.com"

平台的 CA 不在列表里就是被挡了。

2. 主机平台用了意外的 CA

Vercel 和 Cloudflare 这些年在 Let’s Encrypt、Google Trust Services、Sectigo 之间换过。两年前的 CAA 可能不允许今天的 CA。

怎么判断:平台文档或支持工单常说明它们当前用的 CA。跟你的 CAA 对比。

3. CAA 从 registrar 默认继承

某些 registrar(Cloudflare Registrar)默认设 CAA。没意识到的话会以为没有 CAA。

怎么判断:哪怕你没设过 CAA,跑一下 dig CAA。非空就是 registrar 设了默认。

4. 父域名 CAA 继承

example.com 有 CAA,那 app.example.com 除非自己有 CAA、否则继承。所以即使 app.example.com 记录都对,apex 的 CAA 仍生效。

怎么判断

dig CAA app.example.com
dig CAA example.com

子域没 CAA 但 apex 有,apex 的 CAA 就管子域。

5. CAA 只有 iodefissuewild

0 iodef "..."(事件报告)和 0 issuewild "..."(只对通配证书)不限制普通签发。混淆每个字段含义会让你以为签发没问题但其实有问题。

怎么判断:看 CAA 标签(flag 之后第一个词)。只有 issue 控制非通配签发。

6. CAA 的 flag 重要

CAA 记录有 flag 值(0 = optional,128 = critical)。Critical CAA 记录拦住所有未列出的 CA。Criticality 配错会意外拦截。

怎么判断:看开头数字。0 正常;128 critical。

最短修复路径

第 1 步:列出现有 CAA 记录

dig CAA yourdomain.com
dig CAA www.yourdomain.com    # 子域可能有自己的

记下每个 issue 值。

第 2 步:找平台用什么 CA

查平台文档:

  • Vercel:通常 Let’s Encrypt 或 Google Trust Services(会变)
  • Cloudflare:Let’s Encrypt、Google Trust Services 或自有
  • Firebase:Let’s Encrypt
  • Netlify:Let’s Encrypt

不清楚就问支持:“自定义域名的 SSL 你们用什么 CA?“

第 3 步:加或删

选项 A——加平台的 CA

yourdomain.com    CAA    0 issue "letsencrypt.org"
yourdomain.com    CAA    0 issue "pki.goog"          # Google Trust Services
yourdomain.com    CAA    0 issue "sectigo.com"

把平台可能用的所有 CA 加上,加上你已有的。

选项 B——直接删 CAA

删所有 CAA 记录。默认 “任何 CA 都能签”。更简单,安全性略弱但对多数站够用。

第 4 步:等 DNS 传播

CAA 记录可能要 24 小时才完全传播。验证:

dig CAA yourdomain.com @8.8.8.8
dig CAA yourdomain.com @1.1.1.1

两个都应显示新值。

第 5 步:重新触发证书签发

平台控制台通常有 “retry” 或 “remove and re-add” 按钮。不要反复删了重加;最多每小时一次。

第 6 步:验证证书签出

curl -sI https://yourdomain.com | head -3

应该 HTTP/2 200 + 有效证书。或浏览器点锁图标看证书详情。

预防建议

  • 换主机前先查它用什么 CA;同步更新 CAA。
  • 没安全理由不要设限制性 CAA;默认(无 CAA)对多数站点够用。
  • 子域:在 apex 设 CAA;子域除非自己覆盖否则继承。
  • 任何 CAA 变更后等 24h 用多个 resolver 验证再下结论。
  • DNS 笔记里记下 CAA 决策,未来的你才知道为什么有 CAA。

相关阅读

标签: #排查