ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

1Panel证书续期报错DNS记录异常?从ACME校验到解析排查全解析

1Panel证书续期报错DNS记录异常?从ACME校验到解析排查全解析

前几天帮一个朋友处理1Panel证书续期,又看到面板上那个熟悉的红色报错:DNS记录异常。域名解析明明没动过,A记录、TXT记录看起来都对,证书却死活申请不下来。这个报错在1Panel用户里非常典型,处理起来其实不难,但很多人卡在第一步——根本不知道这个提示背后到底在查什么。这篇文章把我实际排查这类问题的完整思路写出来,从ACME校验原理、DNS解析检查、TXT记录写入,到自动API鉴权、服务器出站网络和面板缓存版本,覆盖几个最常见的诱因。不管是刚装好1Panel在申请第一个证书的新手,还是已经跑了半年自动续期的老用户,按这条链路走一遍,基本都能定位到问题。

1. 报错背后的ACME校验机制:DNS记录异常到底在查什么

1.1 面板报错时,证书申请流程已经走到哪一步

1Panel集成的ACME客户端,证书申请并不是一次性的请求,而是分步骤完成的:先向CA注册账号并获取nonce,然后提交包含域名列表的订单,CA返回需要完成的验证方式,客户端执行挑战(HTTP或DNS),CA复核通过后签发证书,最后下载并安装证书。

当面板显示"DNS记录异常"的时候,不一定真的走完了整个提交流程。1Panel在提交订单之前会做一次本地预检,检查域名能否解析、解析记录是否完整。如果域名连A记录都解析不出来,它根本不会把订单提交给CA,而是直接提示DNS记录异常。所以这个报错有两种含义:一种是面板本地预检查出问题,另一种是CA那边回调查询时出了问题。两种情况的排查方向不太一样,下面会分别展开。

这里要理解ACME的DNS-01挑战到底在做什么。你需要在域名下写入一条TXT记录,记录名通常是_acme-challenge.yourdomain.com,记录值是一串随机token。CA收到订单后,会从公网出发去查询这条TXT记录,查到了且值和token一致,才认定你对该域名有控制权。如果CA查询时没找到记录、记录值不匹配、或者查询超时,都会反馈校验失败,最终体现为面板上的DNS相关报错。

1.2 HTTP-01与DNS-01,面板到底选了哪个

1Panel里申请证书时可以选择验证方式,常见的是HTTP验证和DNS验证。报错提示都叫"DNS记录异常",但两种方式背后的校验路径完全不同。

验证方式校验路径1Panel里的适用场景常见报错
HTTP-01CA访问你服务器80端口的指定路径服务器能对外暴露80端口端口不通、路径找不到、A记录不指向本机
DNS-01CA查询域名的TXT记录服务器无法暴露80端口、需要申请泛域名证书DNS记录异常、TXT找不到、记录值不匹配

如果你选的验证方式是DNS,那报错几乎必然和TXT记录有关。如果你选的是HTTP,报错也可能与A记录指向有关——比如域名解析到了别的服务器,或者80端口根本没有对外开放。很多人遇到报错第一反应是重新生成密钥,实际上应该先去确认当前使用的验证方式,再对照排查,方向错了折腾半天也是白搭。

1.3 谁在查、查什么,模拟CA的查询视角

想要理解"DNS记录异常",最直接的办法就是模拟CA的查询,从公网解析链路去看这条记录是否存在、是否匹配。在服务器上执行:

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

如果返回空,说明TXT记录还没有在公网解析链路上生效。如果返回了好几行,可能是历史残留记录,也会导致校验失败。如果返回了一串内容但和面板里显示的token不一致,那就是记录值写错了,或者面板重新生成了token但旧记录还没删。

这个查询视角很关键。很多人在服务器本机dig example.com能看到解析,就觉得一切正常,但CA的查询出口不是你服务器本机的解析通道,而是公网递归链路上的某个节点。从公共DNS看到的结果,才更接近CA实际看到的结果。

2. 第一轮排查:从A记录到CNAME的解析完整性检查

2.1 域名填写的低级错误

第一轮排查永远从最基础的地方开始:面板里填写的域名本身有没有问题。我遇到过几种非常典型的情况:

  • 站点实际用的是web.example.com,证书申请时却只填了example.com,反过来也一样。
  • 域名前面多写了http://或者https://。
  • 复制时带入了不可见字符,比如空格、全角符号。
  • 域名末尾多了一个点,虽然某些场景下合法,但在面板输入框里容易被误判。
  • 填了多个域名,用逗号分隔时混入了中文逗号。

一个经常被忽略的点是:证书申请里填的域名,和站点绑定里的server_name不完全等价。站点可以绑定example.com和www.example.com,但证书申请列表里漏掉其中一个,就会出现部分域名校验通过、部分失败的情况。而1Panel的报错提示往往很笼统,就一句"DNS记录异常",并不会明确告诉你具体是哪个域名出了问题。所以第一步,请把你申请证书时的域名列表逐字核对一遍。

2.2 域名解析商侧的真实记录状态

确认面板填写无误之后,去域名解析托管平台上看一眼实际的解析记录。注意几个细节:

  • 有没有A记录,A记录的值是不是服务器当前公网IP。
  • 记录类型有没有填错,比如该用A记录却填了CNAME,或者反向操作。
  • 如果用了CNAME,CNAME目标域名本身能否正常解析。
  • 某些平台会同时存在多条同名字段记录,旧记录没删会影响判断。

如果你的站点是直接A记录指向面板服务器,那这条A记录应该和面板首页显示的服务器IP一致。如果服务器做过迁移、换了机房,IP变了但解析记录没更新,申请证书时CA从公网访问到的还是旧IP,自然也会报错。这种情况在DNS验证模式里其实影响不大,但如果是HTTP验证模式,几乎必挂。

2.3 用dig还原现场:权威DNS和公共DNS分开看

把解析状态查清楚,推荐一组命令组合:

dig example.com A +short dig example.com NS +short dig @ns1.example-isp.com example.com A +short dig @8.8.8.8 example.com A +short

第一行看本机解析结果,第二行看这个域名用的NS服务器是哪家,第三行是直接向权威NS查询最新记录,第四行是向公共DNS查询缓存结果。为什么要分开看?权威NS返回的才是解析商刚写入的最新记录,公共DNS返回的可能还在缓存期。

举例来说,如果你在解析平台刚加了一条A记录,结果本机dig有返回,但dig @8.8.8.8查不到,说明这条记录还在全球递归节点传播,TTL还没过期。这时候回面板狂点重试没有意义,等传播窗口过了再提交。判断阈值很简单:等5到10分钟,dig @8.8.8.8能看到结果了,再去申请。

3. 手动DNS验证模式:TXT记录写入与传播判断

3.1 需要写一条什么样的TXT记录

手动DNS验证模式下,1Panel会显示一条待写入的TXT记录,通常包括记录名、记录类型和记录值三要素。以申请web.example.com的证书为例,你需要写入的是:

  • 记录名:_acme-challenge.web.example.com
  • 记录类型:TXT
  • 记录值:CA返回的一串随机字符串,形如abc123def456...

这里最容易出错的是记录名的拼接。申请web.example.com时,挑战记录名要加_acme-challenge.前缀;申请泛域名*.example.com时,挑战记录名是_acme-challenge.example.com,没有前面的子域名部分。如果是多域名证书,每个域名都有自己独立的一条挑战记录,不能混用。

很多人在泛域名场景下把记录名写成了_acme-challenge.*.example.com,这就是典型的写错。记录类型也要注意,有人粗心填成了CNAME,CA去查TXT自然是空结果。

3.2 记录写对了,CA还是查不到:TTL和传播延迟

记录写入后不会秒级生效,这是所有DNS场景都要面对的客观规律。TTL(生存时间)告诉递归DNS这个记录可以缓存多久。假设TTL是600秒,那么公共DNS最长会缓存10分钟,权威服务器更新记录之后,全链路上的旧缓存还需要一段时间自然过期。

通常的建议是:添加记录后等待5到10分钟,再用公共DNS查询确认。如果等了30分钟还是查不到,基本就是记录本身的问题,赶紧回去检查记录名、记录值和类型是否填写正确,而不是继续干等。还有一个容易被忽略的点:某些解析托管平台的NS服务器之间同步也有延迟,尤其是一些小型平台,新增TXT记录需要几分钟才能同步到所有NS节点上,这也是正常现象。

3.3 某些解析托管平台的加速模式会吞掉TXT记录

这是手动DNS验证模式下一个比较隐蔽的坑。部分解析托管平台提供了域名解析层面的加速功能,开启后域名流量会走平台自己的边缘节点,而不是直接回源到权威记录。对于HTTP访问来说,这个加速是好事,但对TXT记录的查询可能是灾难。

原因在于,部分平台的加速链路只处理常见的A记录、CNAME记录,对TXT这类非常规记录不会回源,导致外部查询时拿到的是空结果。CA去查_acme-challenge的TXT,查不到,校验失败。这种情况在1Panel里同样表现为"DNS记录异常"。

处理办法也很简单:为挑战记录单独配置一条"仅DNS解析"的记录,或者临时关闭该域名的加速开关,等证书申请成功后再重新开启。这个开关在不同平台叫法不一样,通常在解析设置里的"加速""云朵"或"代理解析"相关位置。

4. 自动DNS API模式下的凭据与权限陷阱

4.1 密钥配置正确性检查清单

自动DNS验证模式省去了手动写TXT记录的步骤,1Panel会调用你选择的域名托管服务商API,自动创建挑战记录。听起来很省事,但实际出问题的概率不比手动模式低,大部分根因都出在API凭据配置上。

常见检查项包括:

  • 是否使用了主账号密钥,很多平台主账号密钥触发的API请求会要求绑定IP白名单。
  • 子账号是否有DNS记录的增删改权限。
  • 申请证书的域名是否已经添加到这个API账号名下的域名列表里。
  • 密钥创建时间是否太久远,某些平台定期作废旧密钥。
  • 是否开启了双因子校验,导致API请求被拦截。

曾经遇到一个案例:某开发者在面板里填好了API Key和Secret,保存时1Panel返回成功,但真正提交证书申请时就报DNS记录异常。后来查看日志发现,API返回的是鉴权失败,原因是子账号权限只给了读取,没有给任何修改权限。这个细节在平台的控制台里非常不起眼,但它就是要命。

4.2 常见表现与根因对照表

现象根因处理方式
创建TXT记录时报鉴权失败密钥权限不足、签名过期重新生成密钥,并授予DNS修改权限
记录创建成功但CA查不到平台NS同步延迟、TTL过大等待传播窗口,或调小TTL
提示域名不存在API账号下没有该域名先把域名添加到托管平台
提交后秒失败,无明确错误面板调用API被平台限流间隔2分钟以上重试
一直提示解析异常但本机查询正常面板运行环境的DNS不可达检查服务器本地DNS配置

这张表可以作为一个快速对照。我的经验是,看到自动API模式下的"DNS记录异常",优先怀疑密钥权限,其次是域名归属,再次才是记录同步。别一上来就删掉重新添加解析记录,那样反而容易把正常记录搞乱。

4.3 从面板和执行日志里挖出第一手错误

1Panel在证书申请失败后,任务详情里往往包含更具体的日志信息,这些日志比面板首页的红色报错更有价值。日志位置通常在安装目录下的logs目录,例如/opt/1panel/logs,不同版本路径可能略有差异,也可以在界面里查看任务的执行输出。

看日志时重点找几个关键词:出现403或unauthorized,基本是密钥权限问题;出现no TXT records,说明自动创建记录没有生效;出现timeout,优先检查网络链路和API接口连通性。日志里往往包含API返回的原始JSON或ACME协议的报错码,把这一段拿出去搜索,能比拿"DNS记录异常"去搜索精准得多。

5. 网络出站与安全组:DNS查询链路被切断的隐蔽原因

5.1 服务器本地的解析能力先自查

1Panel在申请证书前会对域名做预检,如果服务器本身的DNS配置就有问题,解析结果拿不到,同样会被归类为DNS记录异常。排查时先看本机解析配置:

cat /etc/resolv.conf

检查nameserver配置的是内网DNS还是公共DNS,并测试这个DNS是否可用:

dig @172.16.0.2 example.com A +short

如果nameserver指向了一个已经失效的内网地址,解析必然失败。这种情况常见于服务器迁移后,旧的resolv.conf配置没有更新。改成云厂商提供的内网DNS,或者公共DNS地址,基本就能解决。

5.2 UDP 53和TCP 53出站被安全组拦截

DNS查询默认走UDP 53端口,当响应数据较大时会切换到TCP 53。很多云服务器的安全组规则默认只放行80、443、22等常用端口,出站规则如果不放行53,面板内部的预检请求就会卡住。

检查方式很简单,在服务器上执行:

nc -vz -u 8.8.8.8 53

或者用dig直接测试TCP模式:

dig @8.8.8.8 example.com A +tcp

如果超时或无响应,去云控制台的安全组里检查出站规则,确保UDP 53和TCP 53都是放行状态。这个原因比较隐蔽,因为它不影响网站正常访问,很多人想不到去查防火墙出站规则。

5.3 容器网络环境下的DNS坑

1Panel本身是容器化部署,面板内部执行DNS查询时,走的是容器内的解析通道,可能和宿主机不一致。Docker默认会继承宿主机的DNS配置,但如果你自定义过docker daemon的DNS参数,容器内看到的resolv.conf可能完全不同。

可以在1Panel的容器终端里执行cat /etc/resolv.conf,和宿主机上的配置做对比。如果容器内解析正常,宿主机解析异常,问题在宿主机配置;如果反向,那就去检查docker daemon的dns参数。这个对比看起来简单,却能省下很多排查时间。

6. 缓存、传播延迟与面板版本:三个容易被忽略的替罪羊

6.1 本地缓存和浏览器缓存带来的错觉

很多人检查解析时用浏览器打开域名,页面能正常访问,就认为DNS没问题。但浏览器只关心A记录,不关心TXT记录。CA校验TXT记录时,走的是另一条完全不同的查询路径。

服务器本机的解析缓存也可能产生干扰。Linux下systemd-resolved或nscd会缓存解析结果,刷新缓存可以用:

resolvectl flush-caches

如果之前解析失败的结果被缓存,面板反复读取缓存,自然一直报错。刷新缓存后会发现,其实解析记录早就已经生效了。

6.2 记录刚添加就被面板判定异常的传播窗口

解析记录刚添加的前几分钟,是天然的传播窗口,面板这时候去预检,大概率失败。很多人的处理方式是马上重试,重试失败后再去改记录,结果越改越乱。

推荐的重试节奏是:

  1. 在解析平台添加或修改记录。
  2. 观察平台界面显示记录已生效。
  3. 等待5到10分钟,让TTL缓存自然过期。
  4. 用公共DNS手动验证TXT记录或A记录已经可见。
  5. 确认无误后再回到面板提交证书申请。
  6. 如果申请失败,间隔至少2分钟再试,不要连续快速点击。

这套节奏看着简单,但真的能避免大量无效操作。尤其是手动DNS验证模式,先看到TXT记录出现在公网查询结果里,再回面板点申请,成功率会大幅提升。

6.3 面板版本和内置ACME组件的隐性影响

1Panel的证书申请依赖内置ACME客户端,版本更新会轮换客户端实现,也修复过一些关于DNS校验误报的问题。如果你排查了上面的所有环节仍然找不到原因,值得去版本更新日志里看一眼,确认自己当前版本是否存在已知的证书申请相关bug。

升级面板之前建议先做好备份,升级后重新尝试申请。我遇到过的情况是:面板版本太老,内置ACME客户端对某些解析平台返回的DNS状态判断有误,升级到新版本后,同样的配置一次就通过了。这个原因虽然占比不高,但排除起来成本很低,值得一试。

最后分享一个我个人的习惯:遇到DNS记录异常,我不急着点面板里的"重新申请",而是先打开终端,把A记录、TXT记录和NS记录分别dig一遍。确认记录本身没问题,再去看传播窗口、密钥权限和网络出站。这个顺序帮我省掉了大量的重复提交,也避免了面板因为频繁请求进入限流状态。这套排查思路不仅适用于1Panel,任何基于ACME协议的证书申请工具其实都通用,希望这篇能帮你少踩几个坑。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进