用于将1Panel申请的证书上传到多吉云 CDN 并绑定到指定域名。宝塔也可以使用计划任务实现

环境要求

  • Bash

  • OpenSSL

  • cURL

  • jq (用于处理 JSON 数据)

sudo apt-get update
sudo apt-get install jq
or
sudo yum install jq

使用方法

保存下面脚本为 cert_to_dogecloud.sh

#!/bin/bash

# 检查是否传入参数
if [ "$#" -lt 4 ]; then
    echo "Usage: $0 <AccessKey> <SecretKey> <Domain1> <Domain2> ..."
    exit 1
fi

# 从脚本参数中读取 AccessKey 和 SecretKey
ACCESS_KEY="$1"
SECRET_KEY="$2"

# 从脚本参数中读取域名列表
DOMAINS=("${@:3}")

# 证书路径
FULLCHAIN_PATH="./fullchain.pem"
PRIVKEY_PATH="./privkey.pem"

# 证书备注名
CURRENT_DATE=$(date +"%y/%m/%d")
NOTE="Certificate $CURRENT_DATE"

# 生成AccessToken
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"
}

# 上传证书到多吉云
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
}

# 上传证书并绑定到域名
uploadCert "$NOTE" "$FULLCHAIN_PATH" "$PRIVKEY_PATH"

设置执行权限 chmod +x cert_to_dogecloud.sh

在1Panel申请证书时,开启推送证书到本地目录 选项

然后开启 申请证书之后执行脚本

脚本内容

  sudo bash 脚本目录/cert_to_dogecloud.sh <多吉云AccessKey> <多吉云SecretKey> <多吉云需要更新证书的域名1> <多吉云需要更新证书的域名2> ...

比如

sudo bash /opt/upload_cert.sh your_access_key your_secret_key example.com cdn.example.com www.example.com

说明:

  • 多吉云 ACCESS_KEYSECRET_KEY 从脚本的参数中传递。

  • 域名列表 DOMAINS 也通过脚本参数传入,脚本从第三个参数开始读取所有域名。

  • 如果参数不足,脚本会提示用法并退出。

如下图 1Panel配置示例

执行后的输出

脚本来自 https://github.com/DearVinking/Cert2DogeCloud 稍作修改