起因:因為配置國內 CDN 基本都是需要手動上傳證書,但是我申請的域名證書都是基本三個月保質期的,所以就想著寫個自動腳本自動更新證書。
環境:
1panel(國產面板,自動申請證書,還有其他強大功能,挺方便的)
以我用的多吉雲為例,其他廠家都可以去找到相應的 SDK。
代碼如下:
from hashlib import sha1
import hmac
import requests
import json
import urllib
def dogecloud_api(api_path, data={}, json_mode=False):
"""
調用多吉雲API
:param api_path: 調用的 API 接口地址,包含 URL 請求參數 QueryString,例如:/console/vfetch/add.json?url=xxx&a=1&b=2
:param data: POST 的數據,字典,例如 {'a': 1, 'b': 2},傳遞此參數表示不是 GET 請求而是 POST 請求
:param json_mode: 數據 data 是否以 JSON 格式請求,默認為 false 則使用表單形式(a=1&b=2)
:type api_path: string
:type data: dict
:type json_mode bool
:return dict: 返回的數據
"""
# 這裡替換為你的多吉雲永久 AccessKey 和 SecretKey,可在用戶中心 - 密鑰管理中查看
# 請勿在客戶端暴露 AccessKey 和 SecretKey,否則惡意用戶將獲得帳號完全控制權
access_key = ''
secret_key = ''
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()
api = dogecloud_api('/cdn/cert/list.json')
if api['code'] == 200:
for cert in api['data']['certs']:
ssl_next_id = cert['id']
delet_api = dogecloud_api('/cdn/cert/delete.json', {
'id': cert['id']
})
else:
print("api failed: " + api['msg']) # 失敗
# 下面兩個路徑就是1panel自動生成的證書路徑
with open('/opt/1panel/apps/openresty/openresty/www/sites/xxxx/ssl/fullchain.pem') as fullchain:
full = fullchain.read()
with open('/opt/1panel/apps/openresty/openresty/www/sites/xxxx/ssl/privkey.pem') as privkey:
priv = privkey.read()
api = dogecloud_api('/cdn/cert/upload.json', {
"note": f"自動證書{ssl_next_id}",
"cert": full,
"private": priv
})
if api['code'] == 200:
ssl_id = api['data']['id']
else:
print("api failed: " + api['msg']) # 失敗
api = dogecloud_api('/cdn/domain/config.json?domain=cdn.example.com', {
'cert_id': ssl_id
}, True)
基本實現思路就是先刪除現有證書,然後添加讀取的證書,然後上傳並激活上傳後的證書,這樣就實現 CDN 證書自動配置了。可以利用 1panel 自動定時執行腳本功能每隔一個月執行一次,以此更新證書。真是又實現了一個奇奇怪怪的使用小技巧✊✊✊