证书签发和续期
DNS problem: NXDOMAIN:Certbot 查不到域名的原因和修法
Type: dns Detail: DNS problem: NXDOMAIN looking up A for example.com - check that a DNS record exists for this domainDNS 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-challengeCNAME 到另一个区域),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。