banner
棒无

棒无

坟墓里寂静无比,埋葬你的是所有你未说出的话
telegram
github
bilibili
medium
email
mastodon

CDN證書自動刷新

起因:因為配置國內 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 自動定時執行腳本功能每隔一個月執行一次,以此更新證書。真是又實現了一個奇奇怪怪的使用小技巧✊✊✊

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。