BUG、问题:
自己通过接口更新证书后部分网站被指向到了列表中的第一个网站(且chrome提示证书也是第一个网站的证书);后台进行重新部署证书,关闭证书等都提示成功,证书也被正确设置了!但chrome及myssl.com网站检测证书依然是第一个网站的证书。无法通过常规方法修复。
原因:自己有多个域名,自己使用docker定期运行Let’s Encrypt证书机器人申请、续期通配符证书。
1、Let’s Encrypt申请的证书是通过软链接到真实文件的,每次需求证书的名称会变更。
2、自己有多台服务器,使用了上述证书。
目标:
为了实现自动续期证书及自动更新到多台服务器的对应网站上,免除手动去更新。
过程:
通过py脚本调用宝塔接口(chrome抓包)
第一版:通过‘/site?action=SetSSL’接口上传证书,进行更新。
效果:接口提示信息都是成功的。证书被更新了,且证书文件夹也是正常的。但chrome及myssl.com网站显示证书过期时间没有被更新。
```
# 部分代码
# 构造带有签名的关联数组
def __get_key_data(BT_KEY):
now_time = int(time.time())
p_data = {
'request_token': __get_md5(str(now_time) + '' + __get_md5(BT_KEY)),
'request_time': now_time
}
return p_data
def get_site_list(item):
# 获取站点列表
url = item[0] + '/data?action=getData&table=sites'
# 准备POST数据
p_data = __get_key_data(item[1]) # 取签名
p_data['limit'] = 1000 # 获取最多1000个站点
# 请求面板接口
result = requests.post(url, data=p_data, verify=False)
site_list = [i['name'] for i in json.loads(result.text)['data']]
return site_list
def set_ssl(item, site_name, cert_info):
# cert_info: [privkey, fullchain]
# 拼接URL地址
url = item[0] + '/site?action=SetSSL'
# 准备POST数据
p_data = __get_key_data(item[1]) # 取签名
p_data['type'] = 1
p_data['siteName'] = site_name
p_data['key'] = cert_info[0] # 私钥
p_data['csr'] = cert_info[1] # 证书
# 请求面板接口
result = requests.post(url, data=p_data, verify=False)
# 解析JSON数据
return json.loads(result.text)
```
第二版:通过测试,发现关闭SSL证书,再次部署证书即可成功更新证书,于是出现了开头的问题,见代码(代码注释一些是我猜测的,实际不一定是这样)及截图。
```
def close_cert(item, site_name):
# 宝塔面板中要通过接口提交了新证书后只会更新证书文件夹
# 需要关闭证书后再重新部署,才会清除证书缓存
# 拼接URL地址
url = item[0] + '/site?action=CloseSSLConf'
# 准备POST数据
p_data = __get_key_data(item[1]) # 取签名
p_data['updateOf'] = 1
p_data['siteName'] = site_name
# 请求面板接口
result = requests.post(url, data=p_data, verify=False)
# 解析JSON数据
tmp = json.loads(result.text)
return tmp['msg']
def on_cert(item, demon_name, site_name):
# 拼接URL地址
url = item[0] + '/ssl?action=SetCertToSite'
# 准备POST数据
p_data = __get_key_data(item[1]) # 取签名
p_data['certName'] = demon_name
p_data['siteName'] = site_name
# 请求面板接口
result = requests.post(url, data=p_data, verify=False)
# 解析JSON数据
tmp = json.loads(result.text)
return tmp['msg']
```
或许是我遗漏的某些参数还是方法不对?请各位大神及官方人员予以指点,感谢。
|
|