用于将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_KEY
和SECRET_KEY
从脚本的参数中传递。域名列表
DOMAINS
也通过脚本参数传入,脚本从第三个参数开始读取所有域名。如果参数不足,脚本会提示用法并退出。
如下图 1Panel配置示例
执行后的输出
参与讨论