前二ヶ月、腾讯云 CDN が未払いのため即座にサービスを停止することをサポートしていなかったため、多吉云 CDN に切り替えました。
現在、宝塔 / 1Panel の無料 SSL 証明書は 90 日間の有効期限しかなく、自動更新は可能ですが、更新後は頻繁に手動で CDN の証明書を更新する必要があり、とても面倒です。
幸いにも、多吉云 は対応する API を提供しており、スクリプトを使って SSL 証明書を自動的に多吉云 CDN に同期することができます。
機能#
- 🔑 動的に多吉云 API アクセストークンを生成
- 📤 ワンクリックで証明書のアップロードと管理
- 🌐 複数ドメインのスマート証明書バインディング
- 🗑️ 古い証明書のクリーンアップ機能(オプション)
- ⏰ シームレスに Let's Encrypt の自動更新
- ✅ 二つのプラットフォームをサポート(宝塔 / 1Panel)
クイックスタート#
- 多吉云 API キーを取得:
- 多吉云 コンソールにログイン
- 「ユーザーセンター」→「キー管理」に移動
- 新しいキー対を作成
- 証明書のパスを確認:
- 宝塔パネル:
/www/server/panel/vhost/ssl/ドメインディレクトリ/
- 1Panel はスキップ可能
- 宝塔パネル:
設定ガイド#
スクリプト内の以下のパラメータを編集:
# 多吉云 AccessKey と SecretK
ACCESS_KEY="your_access_key_here" # あなたのAccessKeyに置き換えてください
SECRET_KEY="your_secret_key_here" # あなたのSecretKeyに置き換えてください
# 証明書パスの設定
FULLCHAIN_PATH="/path/to/fullchain.pem" # フルチェーン証明書のパス
PRIVKEY_PATH="/path/to/privkey.pem" # プライベートキーのパス
# ドメイン設定
DOMAINS=("example.com" "cdn.example.com" "www.example.com") # バインドする必要のあるドメインリスト
# 古い証明書の処理ポリシー
DELETE_OLD_CERT=false # true=古い証明書を自動削除 | false=履歴証明書を保持
デプロイガイド#
1Panel#
- 証明書管理画面に入る
- 証明書を作成 / 編集:
- 「自動更新」を有効にする
- 「証明書をローカルディレクトリにプッシュ」を有効にする
- ディレクトリを選択
- 「申請後にスクリプトを実行」を有効にする
- このスクリプトの内容を貼り付ける
- 証明書パスを次のように変更:
# 証明書パス
FULLCHAIN_PATH="./fullchain.pem"
PRIVKEY_PATH="./privkey.pem"
宝塔#
- 定期タスクを作成:
- タスクタイプ:Shell スクリプト
- タスク名:任意
- 実行周期:毎月 1 日 01:30 に実行
- 実行ユーザー:root
- スクリプト内容:このスクリプトの内容を貼り付ける
- 自動更新 Let’s Encrypt 証明書の定期タスク
/www/server/panel/pyenv/bin/python /www/server/panel/class/acme_v2.py –renew=1
と組み合わせることで、多吉云 CDN の証明書を放置することが理論的に可能です。
保存後、タスクを一度実行し、以下の情報が表示されれば証明書の同期が完了しています:
証明書のアップロードに成功しました!
証明書ID:12345
証明書は www.vinking.top に正常にバインドされました
証明書は vinking.top に正常にバインドされました
証明書ID 12344 の削除に成功しました。
----------------------------------------------------------------------------
★[2024-12-26 16:01:29] 成功
----------------------------------------------------------------------------
コードの考え方#
キーの取得 & AccessToken
の生成#
多吉云 の API には認証メカニズムがあり、使用前にコンソールの キー管理 で AccessKey
と SecretKey
を取得し、その後 AccessKey
と SecretKey
を基に AccessToken
を生成する必要があります。
AccessToken
の生成プロセスは、リクエストアドレスとリクエスト内容を結合し、SecretKey
を使用して HMAC-SHA1
で暗号化し、得られた暗号値と AccessKey
をコロンで接続します。具体的な生成アルゴリズムはドキュメント 認証メカニズム を参照してください。
# 多吉云 AccessKey と SecretKey
ACCESS_KEY="xxxx"
SECRET_KEY="xxxxxx"
function generateAccessToken() {
local apiPath="$1"
local body="$2"
local signStr=$(echo -e "${apiPath}\n${body}")
local sign=$(echo -n "$signStr" | openssl dgst -sha1 -hmac "$SECRET_KEY" | awk '{print $NF}')
local accessToken="$ACCESS_KEY:$sign"
echo "$accessToken"
}
AccessToken
を生成した後は、リクエストヘッダーに Authorization: TOKEN <AccessToken>
を追加するだけで認証を通過できます。
宝塔のドメイン証明書を見つけて証明書をアップロード#
/www/server/panel/vhost/ssl/
ディレクトリ内には、宝塔のすべてのドメイン名で命名されたフォルダがあり、そのフォルダ内にはこのドメインに対応する完全証明書チェーン fullchain.pem
とプライベートキー privkey.pem
が含まれています。
ここでは、ドメインとそのすべてのサブドメインに同じワイルドカード証明書を使用することをお勧めします。これにより、一度でドメインとそのすべてのサブドメインの証明書を同期できます。
ドメイン vinking.top
の例として、完全証明書チェーンファイルとプライベートキーファイルのディレクトリは次のようになります:
FULLCHAIN_PATH="/www/server/panel/vhost/ssl/vinking.top/fullchain.pem"
PRIVKEY_PATH="/www/server/panel/vhost/ssl/vinking.top/privkey.pem"
ドメイン証明書を取得した後、POST メソッドを使用して https://api.dogecloud.com/cdn/cert/upload.json
に証明書内容を送信する必要があります。アップロードが成功した後は、証明書 ID を取得して、先ほどアップロードした証明書をドメインにバインドします。
参考文書 証明書のアップロード 、 証明書のバインド 。
# 宝塔パネル Let's Encrypt 証明書パス
FULLCHAIN_PATH="/www/server/panel/vhost/ssl/vinking.top/fullchain.pem"
PRIVKEY_PATH="/www/server/panel/vhost/ssl/vinking.top/privkey.pem"
# 証明書の備考名
CURRENT_DATE=$(date +"%y/%m/%d")
NOTE="証明書 $CURRENT_DATE"
# バインドする必要のあるドメインリスト
DOMAINS=("xxxxx.com" "cdn.xxxxx.com" "www.xxxxx.com")
# 多吉云 に証明書をアップロード
function uploadCert() {
local note="$1"
local certFile="$2"
local privateKeyFile="$3"
local certContent=$(<"$certFile")
local privateKeyContent=$(<"$privateKeyFile")
local encodedCert=$(echo "$certContent" | jq -sRr @uri)
local encodedPrivateKey=$(echo "$privateKeyContent" | jq -sRr @uri)
local body="note=$note&cert=$encodedCert&private=$encodedPrivateKey"
local accessToken=$(generateAccessToken "/cdn/cert/upload.json" "$body")
local response=$(curl -s -X POST "https://api.dogecloud.com/cdn/cert/upload.json" \
-H "Authorization: TOKEN $accessToken" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data "$body")
local code=$(echo "$response" | jq -r '.code')
if [ "$code" -eq 200 ]; then
echo "証明書のアップロードに成功しました!"
local certId=$(echo "$response" | jq -r '.data.id')
echo "証明書 ID:$certId"
bindCert "$certId"
else
local errMsg=$(echo "$response" | jq -r '.msg')
echo "証明書のアップロードに失敗しました、エラーコード:$code、エラー情報:$errMsg"
fi
}
# 証明書をバインド
function bindCert() {
local certId="$1"
local responses=()
for domain in "${DOMAINS[@]}"; do
(
local body="id=$certId&domain=$domain"
local accessToken=$(generateAccessToken "/cdn/cert/bind.json" "$body")
local response=$(curl -s -X POST "https://api.dogecloud.com/cdn/cert/bind.json" \
-H "Authorization: TOKEN $accessToken" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data "$body")
local code=$(echo "$response" | jq -r '.code')
if [ "$code" -eq 200 ]; then
echo "証明書は $domain に正常にバインドされました"
else
local errMsg=$(echo "$response" | jq -r '.msg')
echo "$domain への証明書のバインドに失敗しました、エラーコード:$code、エラー情報:$errMsg"
fi
) &
done
wait
}
この記事は Mix Space によって xLog に同期更新されました
元のリンクは https://www.vinking.top/posts/codes/auto-sync-ssl-certificates-to-dogecloud-cdn