织辉科技»论坛 技术科创 办公职场 查看内容

0 评论

323 收藏

分享

阿里云cdn实现SSL证书自动更新部署,并通过邮件进行通知

 

织辉科技温馨提醒:把部分功能需要登陆才能操作……

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 科技江湖 于 2024-12-30 08:56 编辑

近年来,各大厂商把免费的证书从一年缩短到了三个月,当使用cdn又想使用免费证书,就不得不经常进行手动更新,一不小心就会出现忘记的情况导致网站无法正常打开,严重影响用户体验。有人会质疑:为什么不用付费的?目前收费证书一年费用在30到3000不等,对于额外的开销,当然是免费的更有性价比!
庆幸的是目前市面上有支持自动更新签约免费证书的渠道,例如宝塔,1panel等;于是就想到了用这些工具实现证书更新,然后通过阿里云CLI的API进行同步到CDN进行自动部署。
环境配置
Ubuntu24+宝塔面板+阿里云CLI+shell(sh)
宝塔的安装这里掠过,非必装项,仅使用宝塔的定时任务功能
下载阿里云CLI
20241229181952.png
以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版本号,表示安装成功。
image.png
就接下来配置CLI
输入下列指令
aliyun configure

然后根据弹出提示词填写对应参数
AK类型凭证为默认凭证类型,使用AccessKey信息作为身份凭证。配置AK类型凭证时可以忽略--mode选项。
配置必填项如下:
AccessKey Id:指定您的AccessKey ID。
AccessKey Secret:指定您的AccessKey Secret。
Region Id:指定默认区域的Region Id。
image.png
无报错便会出现很多8,如果出现报错,请根据报错内容进行修改
进行cdn绑定
官方有详细教程,这里就不过多讲解
image.png
通过建立脚本进行上传,名字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缓存,请保证计划任务运行时有创建文件权限,否则会运行失败
image.png
注意:若要使用邮箱提示,需要安装相关组件,详情参考

加入宝塔计划任务运行
sudo -u root bash -c 'cd /www/web_sh
./aliyun_cdn_ssl.sh'

image.png
最后运行测试
image.png
宝塔自动更新网站证书计划任务
/www/server/panel/pyenv/bin/python3 -u /www/server/panel/class/acme_v2.py --renew=1

image.png
总结思路
当证书还有30天到期时会自动续签证书,然后通过aliyun_cdn_ssl.sh任务来对比证书的MD5值,当值出现变化,说明证书有变动,则会将更新后的域名证书自动部署到CDN上,并发邮件说明更新证书的网址,最终实现全自动部署,理论上可实现永久使用SSL证书服务,再也不用因忘记而引起证书到期而引起网站不能打开的烦恼了!

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
科技江湖
金牌编辑
主题 167
回复 0
粉丝 0