记录一下那天晚上的排查过程。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 验证覆盖不了。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
