记录一下那天晚上的排查过程。Ubuntu 22.04 上用 certbot 的 DNS 插件签泛域名,renew 时报 DNS problem: SERVFAIL looking up _acme-challenge,手动 dig 解析 TXT 却能看到记录。

刚开始盯着「域名的 NS 记录里有一台已经下线的服务器,查询超时后整体返回失败」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。权威 DNS 刚写入还没同步到所有 NS,验证端查到了还没更新的那一台。也可能是递归服务器开了 DNSSEC 校验,记录签名有问题直接返回 SERVFAIL。

不容易想到的是,防火墙只放行 53 的 TCP,UDP 查询被丢弃,验证端随机失败。

从公网递归逐次确认解析结果

dig @8.8.8.8 _acme-challenge.example.com TXT +short

再往下确认权威 NS 是否都能应答

dig NS example.com +short | xargs -I{} dig @{} _acme-challenge.example.com TXT +short

接着检查 DNSSEC 是否配置正确

dig +dnssec example.com DS +short

剩下的就是等 TTL 过后重试并指定验证服务器

certbot renew --dry-run --preferred-challenges dns

怎么算真的好了,看的是同一批现象。certbot renew –dry-run 输出 Congratulations,说明续期链路可用,正式续期后证书有效期延长三个月。

容易忽略的是,DNS 验证的失败大多是传播延迟,别急着反复重签触发频率限制;泛域名只能用 DNS 方式,HTTP 验证覆盖不了。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189