文章

DNS-01 验证总失败:问题多半出在 DNS 生效慢

静水流深 2小时前 · 2,011 字 · 约 6 分钟 · 6 次阅读
我发布了文章:《DNS-01 验证总失败:问题多半出在 DNS 生效慢》

通配符证书最省事的签法是 DNS-01,但它有个脾气:第一次跑挂,隔两分钟手动重来一次就过了。日志里多半是一句 TXT 记录没找到,或者直接超时。多数人第一反应是 acme.sh 坏了、CA 抽风,其实绝大多数时候锅在 DNS 服务商那边——你那条 TXT 还没传遍它自己的所有节点,CA 来查时正好问到了还没更新的那台。

CA 到底在查什么

DNS-01 的流程不复杂:客户端拿到一个 token,把它变成一条 TXT 记录放在 _acme-challenge.<你的域名> 上,CA 再去查这条记录,查到就发证。麻烦出在中间那一步——几乎所有 DNS 服务商都有一个生效时间,从你提交修改到它所有服务器都能答对新值,这段不为零。

更头疼的是它们大多用 anycast:同一个 IP 背后是很多台机器,你本地 dig 到的答案和 CA 拿到的答案,可能来自两台不同的服务器。所以到底生效了没有,单点验证说明不了什么。

官方给的两条建议很实在:优先挑那种 API 能直接告诉你改完了没有的服务商;如果没有,就让客户端等够久,原话是常常得等到一小时。

三步把问题定位掉

一、先量,不要猜。 手动加一条测试 TXT,直接问权威服务器,别问本地递归缓存:

dig @ns1.your-dns.net _acme-challenge.example.com TXT +short

把它所有的 NS 各问一遍,看是不是有的答新值、有的还在答旧值。只做一次本地 dig 就下结论,最容易误判。

二、等够时间,别让它猜。 acme.sh 默认会拿 Cloudflare 或 Google 的公共 DNS 去复查记录。如果你的服务商本来就慢,或者压根不对外暴露传播状态,就别让它复查了,直接给一个明确的等待时间:

acme.sh --issue -d example.com --dns dns_xxx --dnssleep 300

意思是写完记录干等 300 秒再去验证。这个参数会写进该域名的配置文件(Le_DNSSleep),续期时一样生效,不用每次敲。

三、绕开它,把验证交给别人。 最彻底的办法是 CNAME 委派,而且这不是偏方:CA 官方写得很清楚,可以用 CNAME 或 NS 把 _acme-challenge 委派到别的区域,还专门补了一句——如果你的 DNS 服务商更新很慢,可以委派到一个更新更快的服务上。

做法两步。先把主域的挑战记录指过去:

_acme-challenge.example.com. IN CNAME _acme-challenge.alias.example.

再让 acme.sh 往那个别名域写 TXT:

acme.sh --issue -d example.com --challenge-alias alias.example --dns dns_xxx

三个细节别踩:委派用的 CNAME 别删,续期还要靠它;如果你用 Cloudflare 托管别名域,那条记录必须设成 DNS only,开了代理就不通;想让别名更自由可以用 --domain-alias,这样就不用带 _acme-challenge 前缀。多个域名还能共用同一个别名域,通配符证书也照样能签。

要不要因此换 DNS

我的判断标准只有三条:有没有 API 能自动改记录(这是 DNS-01 能自动化的前提)、API 会不会告诉你改动已经全网生效、生效慢的时候能不能把验证委派出去。前两条是硬指标,第三条是退路。

至于节点数量,看看就好,它不是生效速度的保证。拿 Bunny DNS 举例,官网写的是 36 个以上的 DNS PoP、全球 anycast、多数地区解析延迟 20ms 以内,查询不按量收费,500 个 zone 以内免费(如果只用它这一个产品,账户有每月 1 美元的最低消费),还有 14 天试用、不用绑卡。数字漂亮只说明基础设施铺得开,真正让人放心的其实是另一件事:验证这一步可以随时委派走,主域解析根本不用跟着动。

顺带两句安全上的老实话。DNS 的 API 凭据别直接放在 web 服务器上,官方建议用权限收窄的凭据,或者单独一台机器做验证,再把证书同步过去。另外同一名字下攒的旧 TXT 记得清,响应太大 CA 会直接拒绝。

谁该折腾,谁别折腾

需要通配符证书、机器不能开 80 端口、一个域名背后好几台机器的,DNS-01 绕不开,把上面三步做成默认动作就行。只是给博客或小站续期的,HTTP-01 更简单,80 端口能通就别自己加戏,代价是它签不了通配符。已经稳定自动续期一两年的,什么都别动——加一个 dnssleep 只是把失败换成等待,根因还在那家 DNS 身上。

一句话收尾:证书签发失败时,先别怀疑工具和 CA,先把你这条 TXT 到底多久传遍全网量一遍。这个数字量出来,后面所有选择都不用猜了。

登录 后参与评论

还没有人评论,来抢沙发