当前位置:论坛首页 > Linux面板 > 求助

SSL证书站点错乱,无法通过常规操作修复!!!

发表在 Linux面板2019-11-24 18:51 [复制链接] 0 1409

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']

```


3.png 2.png

或许是我遗漏的某些参数还是方法不对?请各位大神及官方人员予以指点,感谢。


使用道具 举报 只看该作者 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

企业版年付运维跟进群

普通问题处理

论坛响应时间:72小时

问题处理方式:排队(仅解答)

工作时间:白班:9:00 - 18:00

紧急问题处理

论坛响应时间:10分钟

问题处理方式:1对1处理(优先)

工作时间:白班:9:00 - 18:00

工作时间:晚班:18:00 - 24:00

立即付费处理
快速回复 返回顶部 返回列表