宝塔用户_qxeibk 发表于 2024-6-21 18:10:01

【待反馈】宝塔计划任务续签Let's Encrypt证书 有bug

为了能快速了解并处理您的问题,请提供以下基础信息:面板、插件版本:8.20

系统版本:CentOS 7.6.1810(Py3.7.9) 

问题描述:宝塔的计划任务续签Let's Encrypt证书有bug,首次设置lets证书后可以续签,第二次计划任务续签就会显示,虽然显示续签成功,但是实际时间不增加,证书只更新在/www/server/panel/vhost/letsencrypt这个文件夹

相关截图(日志、错误):

运维技术阿闯 发表于 2024-6-21 18:36:40

您好,您说的时间不增加是指新续签的证书没有重置三个月的时间吗,

宝塔用户_qxeibk 发表于 2024-6-21 21:12:04

运维技术阿闯 发表于 2024-6-21 18:36
您好,您说的时间不增加是指新续签的证书没有重置三个月的时间吗,

是的,就是原证书。但是新证书有下载到/www/server/panel/vhost/letsencrypt这个文件夹,但是没同步到vhost/cert和vhost/ssl这两个文件夹里,就是少了检测证书时间早晚这个步骤。你们可以测试下就知道了,按照主题里我说的测试条件。

运维技术阿闯 发表于 2024-6-22 15:25:06

宝塔用户_qxeibk 发表于 2024-6-21 21:12
是的,就是原证书。但是新证书有下载到/www/server/panel/vhost/letsencrypt这个文件夹,但是没同步到vho ...

好的,请您稍等,后期会测试一下这个

宝塔用户_ptxeqy 发表于 2024-10-22 09:21:25

我遇到的问题,和这个情况一模一样
请问如何解决,

宝塔用户_ptxeqy 发表于 2024-10-22 10:13:10

# 替换服务器上的同域名同品牌证书
    def sub_all_cert(self, key_file, pem_file):
      cert_init = self.get_cert_init(pem_file)# 获取新证书的基本信息
      paths = ['/www/server/panel/vhost/cert', '/www/server/panel/vhost/ssl','/www/server/panel']
      is_panel = False
      for path in paths:
            if not os.path.exists(path):
                continue
            for p_name in os.listdir(path):
                to_path = path + '/' + p_name
                to_pem_file = to_path + '/fullchain.pem'
                to_key_file = to_path + '/privkey.pem'
                to_info = to_path + '/info.json'
                # 判断目标证书是否存在
                if not os.path.exists(to_pem_file):
                  if not p_name in ['ssl']: continue
                  to_pem_file = to_path + '/certificate.pem'
                  to_key_file = to_path + '/privateKey.pem'
                  if not os.path.exists(to_pem_file):
                        continue
                  is_panel = True
                # 获取目标证书的基本信息
                to_cert_init = self.get_cert_init(to_pem_file)
                # 判断证书品牌是否一致
                if to_cert_init['issuer'] != cert_init['issuer'] and to_cert_init['issuer'].find("Let's Encrypt") == -1 and to_cert_init['issuer'] != 'R3':
                  continue
                # 判断目标证书的到期时间是否较早
                if to_cert_init['notAfter'] > cert_init['notAfter']:
                  continue
                # 判断认识名称是否一致
                if len(to_cert_init['dns']) != len(cert_init['dns']):
                  continue
                is_copy = True
                for domain in to_cert_init['dns']:
                  if not domain in cert_init['dns']:
                        is_copy = False
                if not is_copy:
                  continue

应该是上面这一段代码判断出的问题,如果有一个不符合就continue 跳过本次循环了。
如果上面这些 continue 的检测都符合,就会接下来执行输出 :

"|-检测到{}下的证书与本次申请的证书重叠,且到期时间较早,已替换为新证书!".format(to_path))

只要有这个提示,那说明就百分百可以续签成功,到期时间也是新的,如果没有这一行输出,那就是证书成功下载安装了,但是文件没有拷贝到 ssl 和 cert 这两个目录,这样就自动续签失败了,


但是这种情况,如果再执行自动续签的计划任务,也是没任何用处的,会提示: 找不到30天内要续签的域名,实际上这个域名并没有续签成功。
所以说这个自动计划任务,每月执行一次和每天执行一次,效果是一样的,就算是每天都执行,也都会提示:找不到30天内的续签域名。

所以说这个计划任务,实际上只给了一次执行的机会,一旦续签出现失败情况,实际上也不叫失败,是letsencrypt 目录下载成功,但没有COPY 到 ssl 和 cert 目录。
一旦续签失败一次,那么在接下来几个月内就再也没机会续签了,因为会一直提示没有到期的证书。所以这个实际上多次的计划任务并没有起任何作用。



另外就是,如果这个续签失败,那么用手工点续签,是一定可以成功的,也就是在网站后面的单独设置里面,SSL里面,直接在页面上点击    续签   按钮,是一定可以成功的。

所以说这个手工点击续签按钮,所用的 LINUX命令是什么,有谁知道可以告诉一下,这样我们可以用LINUX命令来做单独域名网站 的LETSENCRYPT续签,这样不用手工点按钮了

2145630 发表于 2024-10-28 22:45:33

遇到同样的问题,
另外:希望宝塔团队给一份最新的API文档,里面包含证书的续期,任务的触发接口。
目前的API文档都好几年前了,有点拉跨啊,这个。。。
页: [1]
查看完整版本: 【待反馈】宝塔计划任务续签Let's Encrypt证书 有bug