Reader

分享一个冷门的域名记录相关的坑: CNAME 与 TXT 记录冲突影响泛域名证书申请

| V2EX - 技术 | Default

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