DoT导致Caddy申请证书失败
今天遇到了一个奇怪的问题,记录一下解决的过程和经验总结。
一直在 Caddy 上多次稳定使用的 DNS Challenge 证书申请功能,今天在一台机器上始终失败(没有改变 Caddy 配置,也没有变更 API token),在 Caddy 错误日志发现一条关键信息:
presenting for challenge: could not determine zone for domain "_acme-challenge.xxx.mydomain.com": unexpected response code ‘SERVFAIL’ for _acme-challenge.xxx.mydomain.com.
这里的 SERVFAIL
是 DNS 解析遇到错误的时候的返回值。比如 DNSSEC 验证失败的时候就会返回它。
于是我尝试了 dig _acme-challenge.xxx.mydomain.com
果然返回失败,而再次尝试 dig @8.8.8.8 _acme-challenge.xxx.mydomain.com
却能成功返回。
到这里我基本可以判断是 Ubuntu 上的 DNS 解析模块 systemd-resolved 导致的问题。因为通过它解析不行,但通过 8.8.8.8 直接解析则可以,那么问题肯定出在 systemd-resolved 差异化功能配置上。
我想起来前几天给 Ubuntu 的 systemd-resolved 启用了 DNS over TLS (DoT),会不会是这个导致的呢?于是先去关掉这个功能:
#打开配置文件
nano /etc/systemd/resolved.conf
#注释掉 DNSOverTLS 这一项
[Resolve]
DNS=8.8.8.8 8.8.4.4
FallbackDNS=1.1.1.1 1.0.0.1
#Domains=
#DNSSEC=no
#DNSOverTLS=yes
#重启服务
systemctl restart systemd-resolved
再次执行 dig _acme-challenge.xxx.mydomain.com
返回成功。
果断重启 Caddy,不出所料,这次证书申请成功了~
想了想,3个月后证书还要续期,到时候可能还会报错,暂时就不开 DoT了。
导致此问题的具体原因我目前还不清楚,但 Debug 过程本身是成功的 ,其要义就是排除变量~