证书签发和续期

DNS problem: NXDOMAIN:Certbot 查不到域名的原因和修法

作者: · 最后核实

报错信息Type: dns Detail: DNS problem: NXDOMAIN looking up A for example.com - check that a DNS record exists for this domain

DNS problem: NXDOMAIN 的意思是:Let's Encrypt 在公网 DNS 里查询你的域名,得到的回答是“这个名字不存在”。 要么拼错了,要么还没加记录,要么你改记录的那家 DNS 并不是域名实际使用的 DNS 服务器,要么整个域名被暂停解析了。

快速修复

修法是让公网权威 DNS 能查到这个名字。先直接问公共 DNS 和权威服务器,不要用本机 DNS:

dig @223.5.5.5 +short A example.com
dig @1.1.1.1 +short A www.example.com
dig +short NS example.com
dig +trace example.com | tail -20
  • 追踪结果在你 DNS 服务商的服务器那里返回 NXDOMAIN:补上缺的 A/AAAA(或 CNAME)记录。
  • NS 记录不是你正在编辑记录的那家:到注册商那里修改 DNS 服务器。
  • 修好后用 certbot certonly --dry-run -d example.com -d www.example.com 重试。

原因

拼写错误或缺少解析记录是最常见的原因,其次是 DNS 服务器没切换过来和域名被暂停解析。

1. 拼写错误或缺少记录

典型情况是申请了 www.example.com,却从没添加 www 记录,或者 -d 参数里有拼写错误。

  • 确认: dig @1.1.1.1 www.example.com 显示 status: NXDOMAIN。
  • 修复: 加上记录,或者从申请里去掉这个名字。

2. DNS 服务器没有切换过来

你在 DNSPod 改记录,但注册商那里域名还指向阿里云解析(或反过来),改的记录不会生效。

  • 确认: dig NS example.com(或 whois example.com)列出的 DNS 服务器,不是你添加记录的那家。
  • 修复: 到注册商修改 DNS 服务器,或者在域名实际使用的 DNS 服务商那里添加记录。修改 DNS 服务器需要等上级区域的 TTL 过期,往往要几个小时。迁移 DNS 时还可能遇到 SERVFAIL looking up CAA。

3. 域名过期、被暂停解析或刚注册

域名过期,或被设为 clientHold / serverHold(比如实名认证未通过、信息核验未完成),注册局会把它从 DNS 里摘掉。刚注册几分钟的域名,可能还没进入顶级域的区域文件。

  • 确认: whois example.com 显示已过期,或者状态里有 hold。
  • 修复: 续费、完成实名认证或注册商要求的核验,等注册局重新发布。

4. DNS-01:TXT 记录缺失或加错了地方

DNS-01 验证时报错是 NXDOMAIN looking up TXT for _acme-challenge.example.com。

  • 确认: dig +short TXT _acme-challenge.example.com @权威服务器 没有结果。
  • 修复: 在实际生效的区域里添加 TXT 记录,主机记录填 _acme-challenge(子域名则是 _acme-challenge.sub)。如果用了 CNAME 委托(_acme-challenge CNAME 到另一个区域),TXT 要加在 CNAME 指向的地方。DNS 服务商同步慢时,加大客户端的等待时间。

5. 只在内网存在的域名

只存在于内网 DNS 的名字,CA 看不到。

  • 修复: 把名字(至少是 DNS-01 的 TXT 记录)发布到公网 DNS;纯内网名字用私有 CA,做法见 私有 CA 命令。

各环境修法

无论用面板、插件还是 Kubernetes,目标都是让记录出现在公网权威 DNS 上,并等它生效后再验证。

宝塔面板: 用“DNS 验证”方式申请时,面板会调用 DNSPod、阿里云等接口自动加 TXT 记录;API 密钥填错或权限不够时,记录不会被创建,也会报 NXDOMAIN。手动 DNS 验证则要等记录生效后再点“验证”。

Certbot DNS 插件: DNS 服务商同步慢时,调大 --dns-<服务商>-propagation-seconds。

acme.sh: 用 --dnssleep 120 延长等待时间,见 acme.sh 验证失败。

阿里云 / 腾讯云 内网 DNS(PrivateZone 等): 确认改的是公网权威解析,而不是同名的内网解析区域。

Kubernetes(cert-manager): DNS01 求解器使用的递归 DNS 可能与公网不同;内外网分离解析时,设置 --dns01-recursive-nameservers 指向公网 DNS。

不要这样做

改 hosts、立刻重试、多写子域名,都不会让 CA 查到记录,反而多消耗验证次数。

  • 改服务器的 /etc/hosts。 CA 永远看不到它。
  • 刚加完之前返回过 NXDOMAIN 的记录就立刻重试。 否定结果可能被缓存,稍等一会儿,测试阶段用 --dry-run。
  • 为了“以防万一”把所有子域名都写进申请。 每个名字都必须能解析,只要缺一个,整个订单就失败,还算一次验证失败。

常见问题

我自己电脑上能解析,为什么 Let's Encrypt 说 NXDOMAIN?

你的电脑可能用了 hosts 文件、公司内网 DNS 或缓存的结果。Let's Encrypt 查的是公网权威服务器。用 dig @223.5.5.5 example.com、dig @1.1.1.1 example.com,或直接查权威 DNS 服务器来测试。

加完记录要等多久?

所有权威服务器都返回新记录后就能看到,DNSPod、阿里云解析一般几秒到几分钟。如果这个名字之前查过并返回过 NXDOMAIN,递归服务器可能按区域的否定缓存时间(SOA 里的值)缓存这个“不存在”的结果。

域名实名认证没通过,会导致这个错吗?

会。国内注册的域名实名审核未通过,或者被注册局设置为 serverHold / clientHold 状态,会从顶级域的 DNS 里被摘掉,全网解析都是 NXDOMAIN。用 whois example.com 看状态,到注册商(阿里云、腾讯云等)完成实名后再等恢复。

内网主机能申请 Let's Encrypt 证书吗?

只要域名在你控制的公网 DNS 区域里就可以。DNS-01 不要求主机能被访问,所以 app.internal.example.com 只要把 TXT 记录发布到公网 DNS 就能签。.local 等非公共后缀只能用私有 CA。

资料来源

  1. Let's Encrypt: Challenge Types
  2. Certbot User Guide
  3. RFC 8555: Automatic Certificate Management Environment (ACME)