banner
棒无

棒无

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

CDN証明書の自動更新

起因:配置国内 CDN 基本上都需要手動で証明書をアップロードする必要がありますが、私が申請したドメイン証明書は基本的に 3 ヶ月の有効期限ですので、自動スクリプトで証明書を自動更新することを考えました。
環境:
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のクエリストリングを含みます。例:/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: 返されるデータ
    """

    # ここにあなたの多吉云の永久アクセスキーとシークレットキーを置き換えてください。ユーザーセンターのキーマネジメントで確認できます。
    # クライアントでアクセスキーとシークレットキーを公開しないでください。そうしないと、悪意のあるユーザーがアカウントを完全に制御できます。
    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']) # 失敗
# 以下の2つのパスは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 の自動スクリプト機能を利用して、毎月 1 回実行するように設定することで、証明書を更新することができます。これは本当に奇妙な小技を実現しました✊✊✊

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。