前兩個月由於騰訊雲 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] Successful
----------------------------------------------------------------------------
代碼思路#
獲取密鑰 & 生成 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="Certificate $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