# 替换服务器上的同域名同品牌证书
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续签,这样不用手工点按钮了 |