同时申请根域和通配符证书:同名挑战可能需要保留两个 TXT 值
Certbot 同时验证根域和通配符时,同名 DNS 挑战可能需要两个 TXT 值。按当前待验证提示保留全部值,核对权威响应及 hook 清理范围。
使用 Certbot 手动 DNS 验证,同时申请 example.com 和 *.example.com,先按提示添加一个 TXT,出现下一条提示时又把它替换成新值。最终其中一个授权失败,日志可能提示 Incorrect TXT record。如果两个尚未完成的挑战使用同一个记录名称,替换操作可能删掉了仍然需要的第一个值。
DNS-01 允许同一名称存在多个 TXT 记录。根域和通配符的验证都可能落在 _acme-challenge.example.com,但各自要求的值不同。是否需要两个值,取决于本次客户端实际提示的未完成授权;已有有效授权时,不一定每次都会出现两条。
同名不是让后一个值覆盖前一个
以下只是 DNS 记录形式示例,值不能用于实际申请:
_acme-challenge.example.com. 300 IN TXT "challenge-value-one"
_acme-challenge.example.com. 300 IN TXT "challenge-value-two"
这是同一个名称下的两个 TXT 记录值。不要把两段值粘进一个字符串,也不要用空格或逗号把它们拼成一条值。DNS 面板可能要求新增两行,也可能在同一记录集中添加两个成员;以服务商保存后的实际 DNS 响应为准。
Certbot 当前手动流程会提示需要发布的名称和值。保留本次仍待验证的全部值,等它们都能从公网解析到,再按提示继续。不要只因为客户端显示了第二条提示,就删除第一条。
查权威响应,分清覆盖与尚未传播
用实际权威服务器检查,下面的服务器和域名都是示例:
dig NS example.com
dig @ns1.example.net _acme-challenge.example.com TXT
第一条用于确认 DNS 托管方,第二条查看某台权威服务器公布的 TXT 值。应核对实际权威服务器上的结果;如果挑战名称使用 CNAME 或 NS 委派,继续查明最终负责挑战记录的区域,不能只查看根域的面板。
若本次需要两个值,而权威响应始终只有第二个,重点检查面板是否执行了覆盖,以及自动化 hook 是否用替换整个记录集的方式更新 DNS。保存请求成功,并不等于两个值都被保留。
若部分权威响应有两个、部分只有一个或没有,等待提供商完成传播,按其 API 状态或传播机制确认。单个公共递归解析器看到正确结果,不能保证验证服务器从不同网络也看到相同结果。降低 TTL 也不会自动补回已被删除的值。
不要在记录仍不完整时反复发起新的正式申请。新的授权值可能不同,继续添加会把当前值与旧值混在一起。测试客户端或 hook 时应使用测试环境,并注意测试证书不能代替浏览器信任的正式证书。
自动化 hook 要按记录成员添加和删除
自动化 DNS 验证也会遇到同样的问题。检查更新 API 的行为:新增当前值应保留其他仍有效的挑战值;清理时只删除属于本次已完成挑战的成员,不应把同名 TXT 记录集整个清空。
变更 hook 前保留原脚本和 DNS 记录,并确认没有其他机器同时申请同一域名。DNS API 凭据按所需区域和操作范围授权,不把完整账户密钥写入公开日志。仅手动发布 TXT、没有自动化认证 hook 的 Certbot 流程,不能直接获得无人值守续期。
每次挑战结束后,清理已经不再需要的旧值。保留多个当前值是正常用法,长期积累大量过期 TXT 会增大响应,并可能导致验证失败;清理前仍要避免误删其他正在进行的申请。
以授权结果和证书域名为成功标准
成功应包括本次所有待验证授权通过,客户端完成签发,并且证书域名列表包含实际需要的根域及通配符。*.example.com 本身不覆盖 example.com,也不覆盖多层名称如 a.b.example.com,不能只看到通配符就认为所有域名都已包含。
证书签发后仍需按服务原有流程部署并验证访问。若 hook 修改造成其他申请失败,恢复脚本时同时核对当前 DNS 记录;不要盲目恢复整份旧记录集,把后来生成的新挑战值覆盖掉。


