测试环境服务器:使用宝塔面板的正式版(已升级到9.6),能自动续签
生产环境服务器:使用宝塔面板的稳定版,不能自动续签
宝塔面板稳定版9.0.0-lts,存在不能自动续签Let's Encrypt证书的问题,一直没有修复,现在一步步阅读宝塔面板的源代码,手动修复它。
网站有不少let'sEncrypt证书,并且只有几天就过期了,但是执行自动续签计划任务,就告诉你 “没有找到30天过期的SSL......”,明显有bug。

这个问题,在宝塔正式版9.3.0已经修复,能正常自动续签。但是稳定版,官方打着不加新功能,只修bug的口号,一直没有修复。

由于生产服务器宝塔面板安装的是稳定版,稳定版只修BUG,不加新功能。

可能是自动续签功能很少有人用到吧,没人反馈,所以稳定版一直没有修复这个不能自动续签的bug。
这个问题,提醒我们,以后尽量少折腾这种不更新的稳定版,有bug也不会及时修复。
如果你安装的是正式版的宝塔面板,直接升级到最新版,问题就修复了。
但是如果你安装的是稳定版,会一直停留在9.0.0,不能通过升级去修复,需要手动修复。
手动修复,跟踪流程:
查看计划任务中的 “续签Lets Encrypt证书” 的任务。

发现使用python执行了一个py文件 /www/server/panel/class/acme_v2.py

打开文件 /www/server/panel/class/acme_v2.py

搜索字符串“没有找到30天内到期的SSL”

定位到函数 renew_cert

手动插入write_log("续签证书xxxxxxxxxxx") 进行手动代码调试,如下图所示

然后打开计划任务的日志

依次点击:清空日志、执行任务、刷新日志。
就能看到自己手动插入的调试日志

经过调试,发现问题最终在 get_ssl_used_site 函数的 if skey == pkey 上,这个等式判断是有问题的

上图是宝塔面板稳定版9.0.0的写法。
再看看宝塔面板正式版9.6.0的写法,如下图所示:

问题:生产服务器用了稳定版,没法升级到最新的正式版。官方也没有提供稳定版转正式版的方法,真的很坑。生产服务器也不可能卸载宝塔,再重装正式版。
解决方案:
修改代码让它自动续签,废掉这个if判断就可以了。(但是会带来小问题,那些不是用Let's Encrypt的网站也会自动尝试续签)。。

还是不要用稳定版,bug也不更新。最好的解决方案是官方给出稳定版转正式版的方法。
困难能让你进步,遇到问题解决问题,通过宝塔面板的源代码学习python。