织辉科技温馨提醒:把部分功能需要登陆才能操作……
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 科技江湖 于 2024-12-30 08:56 编辑
近年来,各大厂商把免费的证书从一年缩短到了三个月,当使用cdn又想使用免费证书,就不得不经常进行手动更新,一不小心就会出现忘记的情况导致网站无法正常打开,严重影响用户体验。有人会质疑:为什么不用付费的?目前收费证书一年费用在30到3000不等,对于额外的开销,当然是免费的更有性价比!
庆幸的是目前市面上有支持自动更新签约免费证书的渠道,例如宝塔,1panel等;于是就想到了用这些工具实现证书更新,然后通过阿里云CLI的API进行同步到CDN进行自动部署。
环境配置
Ubuntu24+宝塔面板+阿里云CLI+shell(sh)
宝塔的安装这里掠过,非必装项,仅使用宝塔的定时任务功能
下载阿里云CLI
以liunx为作为安装演示
假设您已经下载aliyun-cli-linux-latest-amd64.tgz安装包至$HOME/aliyun目录中。执行如下命令,切换当前目录至$HOME/aliyun目录,并解压aliyun-cli-linux-latest-amd64.tgz文件到$HOME/aliyun目录下,获取文件aliyun。
cd $HOME/aliyun
tar xzvf aliyun-cli-linux-latest-amd64.tgz
配置环境变量
通过移动文件到指定路径通过export命令配置临时环境变量通过配置文件配置永久环境变量
操作步骤说明
完成本步骤之前,请运行echo $PATH命令,确认系统变量值中存在/usr/local/bin路径。否则请您根据实际情况为aliyun程序配置可用的环境变量。
执行如下命令,将aliyun程序复制到/usr/local/bin目录中。
sudo cp aliyun /usr/local/bin
如果您是root用户,请移除sudo命令。
验证安装结果
在终端执行如下命令,验证阿里云CLI是否安装成功。
aliyun version
系统显示类似如下阿里云CLI版本号,表示安装成功。
就接下来配置CLI
输入下列指令
aliyun configure
然后根据弹出提示词填写对应参数
AK类型凭证为默认凭证类型,使用AccessKey信息作为身份凭证。配置AK类型凭证时可以忽略--mode选项。
配置必填项如下:
AccessKey Id:指定您的AccessKey ID。
AccessKey Secret:指定您的AccessKey Secret。
Region Id:指定默认区域的Region Id。
无报错便会出现很多8,如果出现报错,请根据报错内容进行修改
进行cdn绑定
官方有详细教程,这里就不过多讲解
通过建立脚本进行上传,名字aliyun-cdn-ssl.sh
#!/bin/bash
# 函数:发送邮件通知
send_email_notification() {
local subject=$1
local message=$2
local to_email=$3
echo "$message" | mail -s "$subject" "$to_email"
}
# 邮件通知的接收者
RECIPIENT_EMAIL="你的邮箱号@qq.com"
# 宝塔面板证书路径前缀(请根据实际情况修改)
CRT_PATH_PREFIX="/www/server/panel/vhost/cert/"
# 需要同步证书的域名数组
DOMAINS=(
"123.cn"
# 可以继续添加更多的域名
)
# 存储MD5值的文件
MD5_FILE="/www/web_sh/aliyun_cdn_ssl.txt"
# 函数:计算文件的MD5值
calculate_md5() {
local file_path=$1
echo "$(md5sum "$file_path" | awk '{print $1}')"
}
# 函数:上传证书到CDN
upload_cert_to_cdn() {
local domain=$1
local crt_path=$2
echo "开始上传证书到CDN:${domain}"
aliyun cdn SetCdnDomainSSLCertificate \
--DomainName "${domain}" \
--SSLPub="$(cat ${crt_path})" \
--SSLPri="$(cat ${crt_path%fullchain.pem}/privkey.pem)" \
--SSLProtocol on < <(echo -n "")
if [ $? -eq 0 ]; then
echo "证书上传成功:${domain}"
else
echo "证书上传失败:${domain}"
exit 1
fi
}
# 确保MD5_FILE存在
if [ ! -f "$MD5_FILE" ]; then
touch "$MD5_FILE"
fi
# 主程序
for DOMAIN in "${DOMAINS[@]}"; do
CRT_PATH="${CRT_PATH_PREFIX}${DOMAIN}/fullchain.pem"
# 计算当前证书的MD5值
crt_md5=$(calculate_md5 "$CRT_PATH")
# 读取存储的MD5值
if grep -q "$CRT_PATH" "$MD5_FILE"; then
stored_crt_md5=$(grep "$CRT_PATH" "$MD5_FILE" | awk '{print $2}')
else
stored_crt_md5=""
fi
# 检查MD5值是否有变化或者MD5_FILE文件是否为空
if [[ -z "$stored_crt_md5" || "$crt_md5" != "$stored_crt_md5" ]]; then
echo "证书MD5值有变化,开始上传:${DOMAIN}"
upload_cert_to_cdn "$DOMAIN" "$CRT_PATH"
# 上传后更新MD5值
sed -i "/$(echo "$CRT_PATH" | sed 's/\//\\\//g')/d" "$MD5_FILE"
echo "${CRT_PATH} ${crt_md5}" >> "$MD5_FILE"
# 发送邮件通知
send_email_notification "证书更新通知" "域名 ${DOMAIN} 的证书已更新。" "$RECIPIENT_EMAIL"
else
echo "证书MD5值无变化,跳过上传:${DOMAIN}"
fi
done
运行上述代码会创建aliyun_cdn_ssl.txt文件,并写入MD5缓存,请保证计划任务运行时有创建文件权限,否则会运行失败
注意:若要使用邮箱提示,需要安装相关组件,详情参考
加入宝塔计划任务运行
sudo -u root bash -c 'cd /www/web_sh
./aliyun_cdn_ssl.sh'
最后运行测试
宝塔自动更新网站证书计划任务
/www/server/panel/pyenv/bin/python3 -u /www/server/panel/class/acme_v2.py --renew=1
总结思路
当证书还有30天到期时会自动续签证书,然后通过aliyun_cdn_ssl.sh任务来对比证书的MD5值,当值出现变化,说明证书有变动,则会将更新后的域名证书自动部署到CDN上,并发邮件说明更新证书的网址,最终实现全自动部署,理论上可实现永久使用SSL证书服务,再也不用因忘记而引起证书到期而引起网站不能打开的烦恼了!
|