返回 Bug 清单
BUG-0212project-08已修复backend-logic

DNS-01 hook 把「支持的域名」当成「DNS zone」—— 子域名验证必然 400

发现:2026-09-30验证:2026-10-31置信度:98%

症状

把 9 张走 HTTP-01 的证书迁到 DNS-01 时,4 张成功、5 张失败;失败的【全部】是同一个注册域的子域名。用 hook 手动测试:子域名 add → HTTP 400;顶级域 add → 成功写入 TXT。

根因

hook 的 split_zone_rr() 里有 KNOWN_ZONES 列表,里面错误地列入了 5 个子域名(如 accounts..cn)。列表按长度倒序匹配,子域名比根域名长,于是先命中子域名 ⇒ 返回 zone='accounts..cn',而云账号下【不存在这个 zone】⇒ API 400。该 bug 长期潜伏:这些域名此前都用 HTTP-01(webroot),从不走 hook。

修复方案

1) KNOWN_ZONES 只能放【真实的 DNS zone】;『需要支持的域名』是另一个概念,不要混入 zone 列表; 2) 更稳的实现:调用云 API 的 DescribeDomains 动态获取 zone 列表并按最长后缀匹配,而不是硬编码; 3) 加一条单元测试:对每个受支持域名断言 split_zone_rr 的结果; 4) 迁移前先分别用「顶级域 + 每个子域」各做一次 hook 冒烟测试。

检测命令

python3 -c "import spec_from_file_location...; print(split_zone_rr('accounts.example.com'))"  # 期望 zone=example.com

修复命令

KNOWN_ZONES = [".cn", "cognx.cn", "project-06.com", "project-11", "audix.work"]  # 只保留真实 zone,移除所有子域名

错误签名

阿里云 API 返回 HTTP Error 400: Bad Request;certbot 报 Some challenges have failed(仅子域名失败,顶级域成功)

技术信息

来源项目

project-08

标签

letsencrypt, dns-01, acme, aliyun, zone-matching