DNS / CAA 检查

DNS 验证一直不通过、签发报 CAA 错误时,粘贴 CA 要求的主机名,就能看到 5 个公共 DNS 上的解析结果,以及哪些 CA 可以签发。

粘贴 CA 给出的完整主机名,例如 _acme-challenge.example.com、_dnsauth.example.com,再选择记录类型。CAA 按去掉开头验证标签后的域名检查。

检查内容

TXT / CNAME 记录

查询 _acme-challenge、_dnsauth 等验证记录的值,看是否加对、是否指向别处。

CAA 记录

按 CA 的规则逐级向上查找,告诉你哪些 CA 能签发普通证书和通配符证书。

多个公共 DNS 对比

同时查询 Cloudflare、Google、Quad9、阿里和腾讯 DNS,逐个列出结果,看记录是否已经生效。

什么时候需要检查 DNS 和 CAA

签发时报 CAA 错误

Let's Encrypt 报 CAA record for example.com prevents issuance,其他 CA 报 CAA 检查失败,说明域名或上级域名的 CAA 记录没有允许这个 CA。这里会显示生效的是哪一级的记录、允许了哪些 CA,以及要补的那一行记录。

DNS 验证一直不通过

certbot、acme.sh 报 No TXT record found 或 Incorrect TXT record,或者 DigiCert、Sectigo 等 CA 迟迟验证不过,粘贴验证主机名查一下:记录有没有加、值是不是最新的、是否被 CNAME 指向了别处。

刚改完 DNS,不确定生效没有

同时在 Cloudflare、Google、Quad9、阿里和腾讯 5 个公共 DNS 上查询,结果是否一致一眼就能看到,不用逐个执行 dig。

常见问题

什么是 CAA 记录?没有设置会怎样?
CAA 记录声明哪些 CA 可以为域名签发证书,所有公开 CA 签发前都必须检查。没有 CAA 记录时任何 CA 都可以签发,这是大多数域名的默认状态,不需要为了申请证书专门添加。设置之后只有列出的 CA 可以签发,更换 CA 时要同步修改。
怎样添加 CAA 记录允许 Let's Encrypt?
在已有 CAA 记录的那一级域名上(检查结果里会标出),到 DNS 服务商控制台添加一条 CAA 记录:标志 0,标签 issue,值 letsencrypt.org。通配符证书优先看 issuewild:已经有 issuewild 记录时,还要再加一条标签为 issuewild 的同样记录。写成区域文件格式是: example.com. CAA 0 issue "letsencrypt.org" example.com. CAA 0 issuewild "letsencrypt.org" 域名原本没有 CAA 记录时不用添加,任何 CA 都可以签发。
子域名没有设置 CAA,为什么也被拦?
CA 会从要签发的域名开始逐级向上查找,用第一组找到的 CAA 记录,所以根域名上的 CAA 对所有子域名生效。另外,子域名如果是指向 CDN 的 CNAME,CA 会读取 CNAME 目标上的 CAA 记录,这时需要 CDN 服务商放行,或改用 CDN 控制台提供的证书。检查结果会标出记录来自哪一级、是否经过 CNAME。
为什么查不到 _acme-challenge 记录?
签发工具一般在验证前添加记录、验证完删除,平时查不到是正常的。正在验证却查不到时,最常见的原因是主机记录填错:多数 DNS 控制台的主机记录不带根域名,example.com 填 _acme-challenge,www.example.com 填 _acme-challenge.www;如果填成 _acme-challenge.www.example.com,实际生成的是 _acme-challenge.www.example.com.example.com。
DigiCert、Sectigo 等 CA 的 DNS 验证记录也能查吗?
可以。把 CA 给出的完整主机名粘贴进来,选择对应的记录类型即可。常见的有 DigiCert 的 _dnsauth(TXT)、Certum 的 _certum(TXT),以及 Sectigo 以下划线开头的一串哈希(CNAME)。部分 CA 要求把 TXT 直接加在域名本身,这时直接输入域名查询 TXT。
DNS 记录改了多久生效?为什么各个 DNS 结果不同?
新记录在权威 DNS 上通常几十秒内就能查到,但公共 DNS 会按 TTL 缓存旧结果(包括“记录不存在”这个结果),缓存过期前查到的还是旧值。CA 直接查询权威 DNS,一般比公共 DNS 更早看到新记录。签发工具可以在添加记录后多等一会儿再验证,例如 acme.sh 的 --dnssleep。
什么是 DNS 委派(CNAME 验证)?
把 _acme-challenge 用 CNAME 指向另一个专门存放验证记录的域名,CA 会跟随 CNAME 到那里读取 TXT。以后验证记录写在那边,你的 DNS 不用再改,也不用把 DNS API 密钥交给签发工具,acme.sh 的 --challenge-alias 和 acme-dns 都是这种方式。三种验证方式的区别可以看HTTP-01、DNS-01 与 DNS 委派对比。
对应的 dig 命令是什么?
dig CAA example.com +short dig TXT _acme-challenge.example.com +short dig CNAME _acme-challenge.example.com +short 在命令里加 @8.8.8.8 可以指定公共 DNS。注意 dig 不会逐级向上查找 CAA,子域名查不到时要自己再查上级域名。

一条 CNAME,以后续期不再碰 DNS

LapseZero 使用 DNS 委派验证:添加域名时配置一次 CNAME,之后签发、续期和部署全部自动完成,不需要交出 DNS 密钥,也不用每次等记录生效。免费版即可开始。

免费开始