返回 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