前几天帮一个朋友处理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-01 | CA访问你服务器80端口的指定路径 | 服务器能对外暴露80端口 | 端口不通、路径找不到、A记录不指向本机 |
| DNS-01 | CA查询域名的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 记录刚添加就被面板判定异常的传播窗口
解析记录刚添加的前几分钟,是天然的传播窗口,面板这时候去预检,大概率失败。很多人的处理方式是马上重试,重试失败后再去改记录,结果越改越乱。
推荐的重试节奏是:
- 在解析平台添加或修改记录。
- 观察平台界面显示记录已生效。
- 等待5到10分钟,让TTL缓存自然过期。
- 用公共DNS手动验证TXT记录或A记录已经可见。
- 确认无误后再回到面板提交证书申请。
- 如果申请失败,间隔至少2分钟再试,不要连续快速点击。
这套节奏看着简单,但真的能避免大量无效操作。尤其是手动DNS验证模式,先看到TXT记录出现在公网查询结果里,再回面板点申请,成功率会大幅提升。
6.3 面板版本和内置ACME组件的隐性影响
1Panel的证书申请依赖内置ACME客户端,版本更新会轮换客户端实现,也修复过一些关于DNS校验误报的问题。如果你排查了上面的所有环节仍然找不到原因,值得去版本更新日志里看一眼,确认自己当前版本是否存在已知的证书申请相关bug。
升级面板之前建议先做好备份,升级后重新尝试申请。我遇到过的情况是:面板版本太老,内置ACME客户端对某些解析平台返回的DNS状态判断有误,升级到新版本后,同样的配置一次就通过了。这个原因虽然占比不高,但排除起来成本很低,值得一试。
最后分享一个我个人的习惯:遇到DNS记录异常,我不急着点面板里的"重新申请",而是先打开终端,把A记录、TXT记录和NS记录分别dig一遍。确认记录本身没问题,再去看传播窗口、密钥权限和网络出站。这个顺序帮我省掉了大量的重复提交,也避免了面板因为频繁请求进入限流状态。这套排查思路不仅适用于1Panel,任何基于ACME协议的证书申请工具其实都通用,希望这篇能帮你少踩几个坑。