相同前缀的 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 上没这事, 证书随便给.