环境
这是一个 Pythone 脚本,已在Pythone3.11版本中测试运行
前置需要
Python3.11
1panel or BTpanel
安装
如果你是debian12 你可以使用这个命令安装 Pythone3.11
1 2
| apt -y install python3.11 python3.11-venv
|
以下是脚本代码示例,由于现在免费单域名和通配符的免费时长均为90天,因此通配符会更方便些,这里默认就是通配符SSL的配置,没有单域名的设置选项,若有需要请自行修改
基于DogeCloud给的Python SDK
修改
我觉得可以用shell bash直接食用的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328
| # 该脚本适合使用通配符进行证书绑定
# 作者:Hanasaki Misaki
# 引入模块
import re
from hashlib import sha1
import hmac
import requests
import json
import urllib
import datetime
# 引入模块结束
# 默认数值填写
# 需要匹配的域名
defCDNdomain = 'example.com'
# 是否使用二级域名 *.example.com
UseSubDomain = True
# 是否使用三级域名 *.*.example.com
UseThirdDomain = False
# 证书文件路径 绝对路径
SSLFilePath = '/1panel/SSL_Save/full_example_com/'
# 证书文件名
SSL_fullchainName = 'fullchain.pem'
# 证书密钥文件名
SSL_privName = 'privkey.pem'
#默认数值填写结束
# 获取当前日期
nowtime = datetime.datetime.now().strftime('%Y-%m-%d')
# 引入函数模块
def dogecloud_api(api_path, data={}, json_mode=False):
# 这里替换为你的多吉云永久 AccessKey 和 SecretKey,可在用户中心 - 密钥管理中查看
# 请勿在客户端暴露 AccessKey 和 SecretKey,否则恶意用户将获得账号完全控制权
access_key = 'aaaaaaaaaaaaaaaaa'
secret_key = 'aaaaaaaaaaaaaaaaa'
body = ''
mime = ''
if json_mode:
body = json.dumps(data)
mime = 'application/json'
else:
body = urllib.parse.urlencode(data) # Python 2 可以直接用 urllib.urlencode
mime = 'application/x-www-form-urlencoded'
sign_str = api_path + "\n" + body
signed_data = hmac.new(secret_key.encode('utf-8'), sign_str.encode('utf-8'), sha1)
sign = signed_data.digest().hex()
authorization = 'TOKEN ' + access_key + ':' + sign
response = requests.post('https://api.dogecloud.com' + api_path, data=body, headers = {
'Authorization': authorization,
'Content-Type': mime
})
return response.json()
def SSL_OLD_NEW_JSON():
# 从old_id.json中读取id并删除证书 并且确认是否删除成功
with open('old_id.json') as f:
old_id = json.load(f)['id']
api = dogecloud_api('/cdn/cert/delete.json', {'id': old_id})
if api['code'] == 200:
print("脚本:删除证书成功"+"(证书ID: " + str(old_id)+")")
else:
print("脚本:删除证书失败"+"(证书ID: " + str(old_id)+")")
# 删除旧ID证书后将新证书ID保存到old_id.json中 用于下次删除
with open('old_id.json', 'w') as f:
json.dump({'id': ssl_id}, f)
print("证书已保存到old_id.json中")
print("证书ID: " + str(ssl_id))
# 证书绑定域名
def SSL_BIND_DOMAIN(defCDNdomain,ssl_id):
print("域名进行证书绑定")
api = dogecloud_api('/cdn/domain/list.json')
print("传递参数:"+ defCDNdomain)
print("传递参数:"+ str(ssl_id))
# 将defCDNdomain拆分为前后
parts = defCDNdomain.split('.')
if len(parts) == 2: # 确保域名只包含一个点号
defCDNprefix, defCDNsuffix = parts
# 如果使用二级域名
if UseSubDomain:
print("使用二级域名匹配规则")
pattern = r'^([^.]+\.)?' + re.escape(defCDNprefix) + '\.' + re.escape(defCDNsuffix) + '$'
print("正则表达式1"+pattern)
else:
print("不使用二级域名匹配规则")
if UseThirdDomain:
print("使用三级域名匹配规则")
pattern = r'^([^.]+\.){1}' + re.escape(defCDNprefix) + '\.' + re.escape(defCDNsuffix) + '$'
print("正则表达式1"+pattern)
else:
print("不使用三级域名匹配规则")
else:
print("域名格式不正确,创建正则表达式失败")
try:
for domain in api['data']['domains']:
# 仅此匹配*.example.com不匹配*.*.example.com
if re.match (pattern,domain['name']):
print("正则表达式2"+pattern)
print("找到匹配的域名:"+ domain['name'])
cdndomain = domain['name']
print("证书ID:"+ str(ssl_id))
# api = dogecloud_api('/cdn/domain/config.json?domain=' + cdndomain, {'cert_id': ssl_id})
api = dogecloud_api('/cdn/domain/config.json?domain='+ cdndomain, {'cert_id': ssl_id}, True)
print(api)
if api['code'] == 200:
print("脚本:证书绑定成功("+ domain['name']+")")
else:
print("脚本:证书绑定失败("+ domain['name']+")")
else:
print("未匹配的域名:"+ domain['name'])
except Exception as e:
print("域名正则表达式创建失败")
# 引入函数模块结束
# 主程序
__name__ == '__main__'
print("开始执行证书更新")
# 下面两个函数用于读取证书文件 若要修改请到上面的默认数值修改
with open(SSLFilePath+SSL_fullchainName) as fullchain:
full = fullchain.read()
with open(SSLFilePath+SSL_privName) as privkey:
priv = privkey.read()
api = dogecloud_api('/cdn/cert/upload.json', {
"note": f"自动证书"+nowtime,
"cert": full,
"private": priv
})
if api['code'] == 200:
ssl_id = api['data']['id']
print("api success: " + api['msg'])
print("证书ID: " + str(ssl_id))
# 域名绑定证书
SSL_BIND_DOMAIN(defCDNdomain,ssl_id)
else:
print("api failed: " + api['msg']) # 失敗
# 退出脚本
print("因为域名证书上传失败,脚本已退出")
exit()
# 查询是否具有old_id.json
# 如果有则运行SSL_OLD_NEW_JSON
try:
with open('old_id.json') as f:
SSL_OLD_NEW_JSON()
print("已执行删除操作")
except FileNotFoundError:
print("没有找到old_id.json文件,无法执行删除操作")
# 新增old_id.json文件
with open('old_id.json', 'w') as f:
json.dump({'id': ssl_id}, f)
print("已创建新的old_id.json文件")
exit()
print("证书更新已完成")
print("主程序已结束")
|
实现思路
基本实现思路就是先删除现有证书,然后添加读取的证书,然后上传并激活上传后的证书,这样就实现 CDN 证书自动配置了。可以利用 1panel 申请后复制到本地指定位置并且执行脚本,脚本是linux的bash,你可以cd到python脚本的所在目录在python3 main.py运行该脚本执行更新
