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 的關鍵優勢,後者可能被代理阻斷。