CNAME與TXT衝突導致證書申請問題
Categories:
相同前綴的 CNAME 與 TXT 不能共存
折騰過域名的可能知道(A,AAAA)記錄不能與 CNAME 共存, 但未必碰到過 TXT 與 CNAME 衝突的情況.
什麼情況下 TXT 會與 CNAME 同時使用一個前綴?
有一種場景, 就是在 LetsEncrypt 證書申請, 使用 DNS-01 挑戰來驗證域名所有權時.
- Certbot 會使用 ackey 和 acsecret 或者 token, 創建一條
_acme-challenge.example.com的TXT 記錄 - Letsencrypt 會查詢 TXT 記錄, 確認申請方有權創建 DNS 記錄, 證明有域名所有權.
- Letsencrypt 簽發證書
- Certbot 清理
_acme-challenge.example.com的TXT 記錄
倘若創建TXT 記錄時, 已經有一條_acme-challenge.example.com 的CNAME記錄, 則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 上沒這事, 證書隨便給.