起因:配置国内 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 回実行するように設定することで、証明書を更新することができます。これは本当に奇妙な小技を実現しました✊✊✊