本帖最后由 堡塔运维香菜卷 于 2023-10-9 14:36 编辑
本人正在使用宝塔面板提供的 Let's encrypt 证书自动续签服务。
欲续签的域名(假定为 abcd.site)使用的是阿里云 DNS 服务,已配置好 AccessKey 和 SecretKey
证书包含的域名包括:
abcd.site
*.abcd.site
*.local.abcd.site
由于包含泛域名,统一使用 DNS TXT 记录验证。
在最新的 7.9.7 宝塔面板中续签时,反复出现域名验证失败的问题,其中部分日志如下:
- |-共需要续签 1 张证书
- |-正在续签第 1 张,域名: ['abcd.site', '*.abcd.site', '*.local.abcd.site']..
- |-正在创建订单..
- |-正在获取验证信息..
- |-验证类型:dns-01
- ('找不到域名的record_id: ', 'abcd.site')
- |-验证类型:dns-01
- ('找不到域名的record_id: ', 'abcd.site')
- |-验证类型:dns-01
- ('找不到域名的record_id: ', 'abcd.site')
- |-正在验证域名..
- |-尝试本地验证DNS记录,域名: _acme-challenge.abcd.site , 类型: TXT 记录值: Edxo6qnnSlB9lWuE4-Ay4UfmVCG2Q7L8S9olCbK-BSg
- /www/server/panel/class/acme_v2.py:964: DeprecationWarning: please use dns.resolver.resolve() instead
- ns = dns.resolver.query(domain, s_type)
- |-第 1 次验证值: -LCclg9I05gYWBCNTrxT0UuJTwuoLeU0Jz379BfTsfM
- |-第 2 次验证值: -LCclg9I05gYWBCNTrxT0UuJTwuoLeU0Jz379BfTsfM
- ......
- |-第 20 次验证值: -LCclg9I05gYWBCNTrxT0UuJTwuoLeU0Jz379BfTsfM
- |-本地验证失败!
- |-尝试本地验证DNS记录,域名: _acme-challenge.local.abcd.site , 类型: TXT 记录值: UfxYeeFT45o6uCEAKOZCKa2Q4lZyuY7fBBXXBXBzF3o
- |-第 1 次验证值: UfxYeeFT45o6uCEAKOZCKa2Q4lZyuY7fBBXXBXBzF3o
- |-本地验证成功!
- |-尝试本地验证DNS记录,域名: _acme-challenge.abcd.site , 类型: TXT 记录值: -LCclg9I05gYWBCNTrxT0UuJTwuoLeU0Jz379BfTsfM
- |-第 1 次验证值: -LCclg9I05gYWBCNTrxT0UuJTwuoLeU0Jz379BfTsfM
- |-本地验证成功!</font></b>
- |-第1次查询验证结果..
- |-验证失败!
- error_result: Incorrect TXT record "-LCclg9I05gYWBCNTrxT0UuJTwuoLeU0Jz379BfTsfM" found at _acme-challenge.abcd.site
- |-在['_acme-challenge.abcd.site']上发现错误的TXT记录:['-LCclg9I05gYWBCNTrxT0UuJTwuoLeU0Jz379BfTsfM'],请检查TXT解析是否正确,如果是DNSAPI方式申请的,请10分钟后重试! </font></b>
复制代码
通过 debug acme_v2.py 归纳错误原因如下:
1. abcd.site 和其对应的泛域名 *.abcd.site 需要验证两次,其对应所需的 TXT 记录名称均为 _acme-challenge.abcd.site,但所需的记录值不同。
2. 对于待验证域名 *.abcd.site,其所需 TXT 记录值为 -LCclg9I05gYWBCNTrxT0UuJTwuoLeU0Jz379BfTsfM
3. 对于待验证域名 abcd.site,其所需 TXT 记录值为 Edxo6qnnSlB9lWuE4-Ay4UfmVCG2Q7L8S9olCbK-BSg
4. 若需确保当前证书续签通过 Let's Encrypt 的域名验证,则需要同时具有两条名称为 _acme-challenge.abcd.site 的 TXT 记录,分别对应上述两个值。
5. 当前版本宝塔面板的 acme_v2.py 会统一调用 DNS API,一次性更新单个证书所需的所有 TXT 记录。且对每一个续签的域名,都会先删除已有记录,再添加新记录。
6. 由于 *.abcd.site 和 abcd.site 中势必有一个域名先进行 TXT 记录更新,因此在第二个域名更新 TXT 记录时,第一个域名所需的 TXT 记录就会被错误地删除。
7. 基于第 6 条所述现象,续签时 *.abcd.site 和 abcd.site 两个域名中必然有一个无法通过本地和 Let's Encrypt 的 DNS 验证(对应日志“本地验证失败”)。
另外,还有一个 debug 中遇到的问题:
7.9.7 版宝塔面板的 acme_v2.py 第 299 行,“请求创建订单”后的“如果创建失败”判断,状态码只包括 201。
但在使用 HTTP 代理时,此处的状态码可能为 200。
建议:
1. 临时记录每次续签时已添加的 Record ID,避免在更新其它域名对应的 TXT 记录时错误地删除本次所需的 TXT 记录。
2. “请求创建订单”后的“如果创建失败”判断,条件修改为状态码为 200 或 201。
|
|