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

> Let's Encrypt 查询域名时被告知不存在。检查拼写、解析记录、DNS 服务器是否生效、域名是否被暂停解析（实名未通过、过期），以及 DNS-01 的 TXT 记录位置。

Source: https://ssl.sh/zh/errors/certbot-dns-problem-nxdomain/
Last updated: 2026-11-10

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

## 快速修复

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

```bash
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](https://ssl.sh/zh/errors/certbot-dns-problem-servfail-caa/)。

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

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

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

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

[DNS-01](https://ssl.sh/zh/glossary/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 命令](https://ssl.sh/zh/cookbook/private-ca/)。

## 各环境修法

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

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

**Certbot DNS 插件：** DNS 服务商同步慢时，调大 `--dns-<服务商>-propagation-seconds`。

**acme.sh：** 用 `--dnssleep 120` 延长等待时间，见 [acme.sh 验证失败](https://ssl.sh/zh/errors/acme-sh-verify-error/)。

**阿里云 / 腾讯云 内网 DNS（PrivateZone 等）：** 确认改的是公网权威解析，而不是同名的内网解析区域。

**Kubernetes（cert-manager）：** DNS01 求解器使用的递归 DNS 可能与公网不同；内外网分离解析时，设置 `--dns01-recursive-nameservers` 指向公网 DNS。

## 不要这样做

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

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