CNAME與TXT衝突導致證書申請問題

相同前綴的 CNAME 與 TXT 不能共存

折騰過域名的可能知道(A,AAAA)記錄不能與 CNAME 共存, 但未必碰到過 TXT 與 CNAME 衝突的情況.

什麼情況下 TXT 會與 CNAME 同時使用一個前綴?

有一種場景, 就是在 LetsEncrypt 證書申請, 使用 DNS-01 挑戰來驗證域名所有權時.

  1. Certbot 會使用 ackey 和 acsecret 或者 token, 創建一條_acme-challenge.example.comTXT 記錄
  2. Letsencrypt 會查詢 TXT 記錄, 確認申請方有權創建 DNS 記錄, 證明有域名所有權.
  3. Letsencrypt 簽發證書
  4. Certbot 清理_acme-challenge.example.comTXT 記錄

倘若創建TXT 記錄時, 已經有一條_acme-challenge.example.comCNAME記錄, 則TXT記錄可能會創建失敗, 導致域名挑戰驗證失敗.

為什麼會出現_acme-challenge.example.com 的CNAME記錄?

阿里雲新推出的 ESA 邊緣安全加速, 類似 cloudflare, 是原 DCDN 全站加速的改名增強版. 在早期使用時, 不支持自助申請泛域名, 我是使用腳本週期性將自己申請的泛域名證書傳上去, 管理起來稍有不便. 後來出了託管 DCV, 可以自助申請更新泛域名證書, 按照說明操作, 的確可以自助管理泛域名證書. 但埋下的隱患隔了數月才發現. 這個 CNAME 記錄持續存在, 會導致不能創建相同前綴的 TXT 記錄, 導致我不能在別處證明域名所有權.

解決方案

方案一: 不使用託管 DVC

託管 DVC 要求將_acme-challenge.example.com寫入指定值, 本質上是聲明該域名屬於第三方, 自己不再擁有該域名的控制權.

需要泛域名的話, 可以使用任務腳本調用 ESA 的 API, 定時將泛域名證書上傳到 ESA.

方案二: 不使用 DNS-01 驗證域名所有權

Certbot 提供幾種域名所有權驗證(challenge, 挑戰)方法, 除了根域名驗證(DNS-01)外, 還可以使用 HTTP-01 和 TLS-ALPN-01 等方法.

HTTP-01 和 TLS-ALPN-01 方法需要先有服務, 驗證可訪問性之後, 再給證書.

DNS-01 可以在搭建服務之前就獲取證書.

方案三: 打破 ESA 和雲解析 DNS 的業務牆

這倆業務同屬阿里雲, 但各自實現了一套 DNS API, 如果ESA可以自助在雲解析 DNS設置 CNAME 或 TXT 記錄, 獲取完證書後, 刪除記錄, 則不會影響在別處使用 DNS-01 挑戰.

方案四: 不使用阿里 ESA

cloudflare 上沒這事, 證書隨便給.