DNS-01 是支持通配符证书(*.example.com)的 ACME 验证类型。它通过在 DNS 中添加 TXT 记录来证明域名所有权 — 不需要 Web 服务器或 80 端口访问权限。
工作原理
- Let’s Encrypt 为每个域名提供一个 token
- GetHTTPS 对 key authorization 计算 SHA-256 摘要并进行 base64url 编码
- 你在
_acme-challenge.yourdomain.com创建一条 TXT 记录,值为该编码结果 - Let’s Encrypt 通过公共 DNS 查询该 TXT 记录
- 如果值匹配,验证通过,证书即被签发
使用 GetHTTPS 时,第 1-2 步自动完成 — 你只需将记录名称和值复制粘贴到 DNS 服务商中。
分步设置
第一步:从 GetHTTPS 获取 TXT 记录信息
GetHTTPS 会显示:
- 记录名称:
_acme-challenge.yourdomain.com - 记录值:一个 base64url 编码的字符串(约 43 个字符)
第二步:在 DNS 服务商添加 TXT 记录
| 字段 | 值 |
|---|---|
| 类型 | TXT |
| 名称 | _acme-challenge(某些服务商会自动追加域名) |
| 值 | GetHTTPS 显示的字符串 — 直接复制粘贴 |
| TTL | 60 秒(或服务商允许的最低值) |
各服务商操作说明:
Cloudflare
- Dashboard → 你的域名 → DNS → Records → Add record
- Type: TXT,Name:
_acme-challenge,Content: 粘贴值 - TTL: Auto
- 点击 Save
AWS Route 53
- Hosted zones → 你的域名 → Create record
- Record name:
_acme-challenge - Record type: TXT
- Value:
"paste-value-here"(必须包含双引号 — Route 53 要求如此) - TTL: 300
- 点击 Create records
GoDaddy
- DNS Management → Add
- Type: TXT,Name:
_acme-challenge,Value: 粘贴值 - TTL: 1 Hour(最低可选值)
- 点击 Save
Namecheap
- Domain List → Manage → Advanced DNS → Add new record
- Type: TXT,Host:
_acme-challenge,Value: 粘贴值 - TTL: Automatic
- 点击 Save all changes
Google Cloud DNS
gcloud dns record-sets create _acme-challenge.yourdomain.com. \
--zone=your-zone --type=TXT --ttl=60 --rrdatas="the-value"
DigitalOcean
- Networking → Domains → 你的域名 → Add record
- Type: TXT,Hostname:
_acme-challenge,Value: 粘贴值 - TTL: 30
第三步:等待 DNS 传播
DNS 变更需要 1-15 分钟,具体取决于服务商和 TTL 设置。GetHTTPS 的预检功能会在提交给 Let’s Encrypt 之前验证 TXT 记录是否已从公网可见。
手动检查传播状态:
dig TXT _acme-challenge.yourdomain.com +short
# Should return your value (in quotes)
你也可以使用在线传播检测工具查看记录是否在全球可见。
第四步:在 GetHTTPS 中验证
点击 Verify。GetHTTPS 将向 Let’s Encrypt 提交验证请求。如果 TXT 记录正确,证书即被签发。
第五步:清理
证书签发后,删除 DNS 中的 _acme-challenge TXT 记录。它不再需要,残留的过期记录可能在续签时造成混淆。
使用 DNS-01 获取通配符证书
要获取 *.yourdomain.com 的证书,必须使用 DNS-01。HTTP-01 无法验证通配符,因为通配符涵盖无限个主机名 — 不存在一台服务器能放置文件。
通配符 + 裸域名: 如果你同时需要 *.example.com 和 example.com,GetHTTPS 可能需要两次验证。某些情况下需要在 _acme-challenge.example.com 同时存在两条 TXT 记录 — 一条用于通配符,一条用于裸域名。两条记录都保留到验证通过为止。
DNS-01 与 HTTP-01 对比
| DNS-01 | HTTP-01 | |
|---|---|---|
| 操作内容 | 在 DNS 中添加 TXT 记录 | 在服务器上放置文件 |
| 所需权限 | 域名 DNS 设置 | Web 服务器文件系统 |
| 端口要求 | 无 | 80 端口必须开放 |
| 通配符支持 | ✅ 通配符必须使用 | ❌ |
| 无服务器时可用 | ✅ | ❌ |
| 速度 | 1-15 分钟(DNS 传播) | 即时(文件可访问的前提下) |
| CDN 后是否可用 | ✅ 始终可用 | ⚠️ 可能需要绕过 CDN |
| 最适合 | 通配符、无服务器、CDN 场景 | 大多数单域名证书 |
选择 DNS-01 的场景: 需要通配符、80 端口被封、服务器不在公网、或在 CDN 后面。
选择 HTTP-01 的场景: 有 Web 服务器、80 端口开放、不需要通配符。速度更快(无需等待传播)。
故障排除
GetHTTPS 找不到 TXT 记录
- 多等一会 — 某些服务商需要 5-15 分钟。低 TTL 有帮助但不能完全消除传播时间。
- 检查记录名称: 某些服务商会自动追加域名。如果你输入了
_acme-challenge.example.com而服务商又追加了.example.com,实际记录会变成_acme-challenge.example.com.example.com(错误)。只输入_acme-challenge,让服务商自动追加。 - 手动验证:
如果返回空,说明记录还未传播。dig TXT _acme-challenge.yourdomain.com +short
值错误 / 大小写不匹配
- 值是区分大小写的。直接从 GetHTTPS 复制粘贴 — 不要手动重新输入。
- 除非 DNS 服务商要求(如 Route 53),否则不要添加引号。
多条 TXT 记录冲突
- 添加新记录前,删除之前尝试留下的旧
_acme-challengeTXT 记录。 - 例外:通配符 + 裸域名验证可能需要同一名称下同时存在两条记录。
DNS 服务商不支持 TXT 记录
少见,但某些基础 DNS 服务缺少 TXT 支持。换用功能完整的 DNS 服务商(Cloudflare 免费版支持所有记录类型)。
何时使用 DNS-01
| 场景 | 适合 DNS-01? |
|---|---|
通配符证书(*.example.com) | ✅ 必须使用 |
| 80 端口被封 | ✅ 最佳选择 |
| 服务器在内网 | ✅ 唯一选择 |
| 在 Cloudflare/CDN 代理后面 | ✅ 避免代理问题 |
| 域名没有服务器(停放、重定向) | ✅ 唯一选择 |
| 有服务器的简单单域名证书 | ⚠️ HTTP-01 更快 |
常见问题
能自动化 DNS-01 验证吗?
可以,通过命令行工具。acme.sh 内置了 150+ DNS 服务商的 API 集成 — 可以自动添加和删除 TXT 记录。Certbot 也支持主流服务商的 DNS 插件。GetHTTPS 需要手动修改 DNS(基于浏览器,不调用 API)。
把 DNS API 密钥给 ACME 客户端安全吗?
API 密钥对你的 DNS 区域有写权限,应当像对待服务器凭据一样重视。尽可能使用作用域受限的 API token(如 Cloudflare 的按区域 token)。为了最大安全性,使用 GetHTTPS 手动修改 DNS — 不涉及任何 API 密钥。
TXT 记录需要保留多久?
仅在验证期间需要 — 通常几分钟。证书签发后即可删除。续签时会创建新的记录和新的值。
DNS 服务商传播很慢怎么办?
将 TTL 设置为服务商允许的最低值(理想情况为 60 秒)。如果传播超过 15 分钟,检查记录名称/值是否有拼写错误,或换用其他 DNS 服务商。Cloudflare 的 TXT 记录传播通常在几秒内完成。
DNS-01 在 Cloudflare 代理(橙色云朵)下可用吗?
可以。DNS-01 验证通过 DNS 查询 TXT 记录,而非 HTTP — 因此 Cloudflare 代理状态(橙色或灰色云朵)无关紧要。这是相比 HTTP-01 的关键优势,后者可能被代理阻断。