banner
Vinking

Vinking

你写下的每一个BUG 都是人类反抗被人工智能统治的一颗子弹

將 SSL 證書同步到多吉雲 CDN

前兩個月由於騰訊雲 CDN 不支持欠費立刻暫停服務換到了多吉雲 CDN。

但是!

目前 寶塔 / 1Panel 的免費 SSL 證書都只有 90 天的有效期,雖然可以自動續簽,但是續簽後還是需要頻繁手動更新 CDN 的證書,非常麻煩。

好在多吉雲提供了對應的 API,使得我們可以通過腳本的方式自動實現同步 SSL 證書到多吉雲 CDN。

image

功能#

  • 🔑 動態生成多吉雲 API 訪問令牌
  • 📤 一鍵式證書上傳與管理
  • 🌐 多域名智能證書綁定
  • 🗑️ 舊證書清理功能(可選)
  • ⏰ 無縫銜接 Let's Encrypt 自動續期
  • ✅ 雙平台支持(寶塔 / 1Panel)

快速開始#

  1. 獲取多吉雲 API 密鑰:
    • 登錄多吉雲控制台
    • 進入「用戶中心」→「密鑰管理」
    • 創建新密鑰對
  2. 確認證書路徑:
    • 寶塔面板:/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#

  1. 進入證書管理界面
  2. 創建 / 編輯證書:
    • 啟用「自動續簽」
    • 啟用「推送證書到本地目錄」
    • 選擇目錄
    • 啟用「申請後執行腳本」
    • 粘貼本腳本內容
    • 修改證書路徑為:
# 證書路徑
FULLCHAIN_PATH="./fullchain.pem"
PRIVKEY_PATH="./privkey.pem"

1Panel 證書設置

寶塔#

  1. 創建定時任務:
    • 任務類型:Shell 腳本
    • 任務名稱:隨意
    • 執行週期:每月 1 號 01:30 執行一次
    • 執行用戶:root
    • 腳本內容:粘貼本腳本內容

寶塔定時任務

  1. 配合自動續簽 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,然後根據 AccessKeySecretKey生成 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


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