Categories
Uncategorized

解决宝塔面板自动续签SSL证书时验证逻辑问题

1.预制的acme_v2.py自动续签脚本续签失败,看log是3次续签失败导致的脚本中断。可是每次宝塔界面却可以手动续签。所以排除网络问题,配置问题。
2. 在/www/server/panel/class/acme_v2.py中,log中提示的1456行,跳出 if self._config[‘orders’][‘retry_count’] >= 3: 看起来是个检测重试次数retry_count的语句。
3.寻找这个retry_count的计数值是在哪里保存,在py脚本的62行找到了: _conf_file = ‘config/letsencrypt.json’ 。
4.编辑/www/server/panel/config/letsencrypt.json,在里面的order段落中,找到了好几个证书续签的条目。其中有几个是之前删过的域名(看domains和save path),并且retry_count=3。
5.备份配置文件,把这几个retry_count=3的证书续签的order删掉再次运行py脚本,问题解决。
6.如果还有问题,可以把所有order都删掉,然后去宝塔的ssl面板中删除证书,再重新申请即可。

综上所述,问题的所在应该是原来在宝塔ssl证书界面的某些操作,导致无效的续签信息保存在了/www/server/panel/config/letsencrypt.json当中,宝塔的校验逻辑又不缜密,web界面删除站点或者证书时,没有将letsencrypt.json中相应的续签信息删掉,导致配置文件中一直存在retry_count=3的条目。acme.py脚本执行时,检测到retry_count超出限制,脚本中断执行。

这个主要问题其实是
/www/server/panel/class/acme_v2.py 第1456行的这句话变量问题
self._config[‘orders’][index][‘domains’] -> self._config[‘orders’][i][‘domains’]

把index 改成 i 就可以了