你在 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 只有 iodef 或 issuewild
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。
相关阅读
- SSL 证书还在 pending
- DNS 改了但站点还是打不开
- 通配 DNS 不命中三级子域
- 同一域名在 Vercel 工作但 Firebase 不行
- 域名连接后站点时而能开时而不能:4 个原因 + 对症修复
- 浏览器 SSL Mixed Content 警告
- 证书被拒:Certificate Transparency 日志不匹配 —— 排查指南
- Cloudflare 橙云灰云搞反,站点立刻挂 —— 排查与修复
- 开启 DNSSEC 后 SERVFAIL:信任链断了 —— 排查与修复
- HSTS preload 进了就出不来:站点被锁死在 HTTPS
- IPv6 用户打不开站点:AAAA 记录缺失或挂了 —— 完整排查
- 子域 NS 委派挂了:缺 Glue 记录 —— 排查与修复
标签: #排查