2022年8月28日星期日

Linux下定期自动更新https加密证书

前置准备


  脚本需要的软件包

sudo apt install zip
sudo apt install curl

建立证书及脚本及执行

mkdir /etc/ssl/zs
cd /etc/ssl/zs
vim /etc/ssl/zs/ssl_update.sh

  chmod 777 /etc/ssl/zs/ssl_update.sh

./ssl_update.sh

添加自动执行任务
crontab -e
如提示未知命令,则安装cron
安装:apt-get install cron
启动:service cron start

编辑定时任务

0 0 1 * * /etc/ssl/zs/ssl_update.sh

默认使用nano编辑器
如果你要保存所做的修改,按下Ctrl+O。
想要退出,按下Ctrl+X。
如果你退出前没有保存所做的修改,它会提示你是否要保存;如果不要,请按N,反之,则按Y;然后它会让你确认要保存的文件名,确认或修改后按Enter即可。

查看自动执行任务

crontab -l

以下是自动更新脚本的具体实现,

根据接口文档,可以编写满足需求的bash文件,实现自动部署功能。 主要参数说明:

注册地址: 平台注册      证书列表: 证书列表     

API获取地址 API接口


ssl_update.sh 自定义脚本内容

ORDER_ID:证书ID TYPE:证书ID类型。建议auto。 API_TOKEN:接口凭证,在后台获取。 API_USER:账户名。注册的邮箱或者手机号。

#!/usr/bin/env bash
export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

# 参数配置 开始
ORDER_ID='*****'
TYPE='auto'
API_TOKEN='**************'
API_USER='**************'
FILE_CERT='/etc/ssl/zs/fullchain.crt'
FILE_CERT_KEY='/etc/ssl/zs/private.pem'
COMAND_RELOAD='nginx -s reload'
# 参数配置 结束

# 以下内容根据需求修改
# 证书到期前13天内才会更新
isexpire=`openssl x509 -in ${FILE_CERT} -noout -enddate -checkend 9123200`
if echo "${isexpire}" | grep  " not " ; then
    echo "Certificate will not expire."
    exit 1
fi

API_URL='https://api.osfipin.com/letsencrypt/api'
URL_ORDER_DOWN="${API_URL}/order/down"
HEADER_AUTHOR="Authorization: Bearer ${API_TOKEN}:${API_USER}"
ZIP_FILE="${ORDER_ID}.$RANDOM"
curl ${URL_ORDER_DOWN} -"${HEADER_AUTHOR}" --"id=${ORDER_ID}" -"type=${TYPE}" -o ${ZIP_FILE}.zip

if [ ! -"${ZIP_FILE}.zip" ]; then
    echo "download error."
    exit 1
fi

size=`du -b ${ZIP_FILE}.zip | awk '{print $1}'`
if [[ ${size} -lt 500 ]]; then
    echo "download file error."
    cat ${ZIP_FILE}.zip
    unlink ${ZIP_FILE}.zip
    exit 1
fi


# 解压 移动文件
mkdir -p ${ZIP_FILE}
unzip ${ZIP_FILE}.zip -d ${ZIP_FILE}
/bin/cp ${ZIP_FILE}/fullchain.crt ${FILE_CERT}
/bin/cp ${ZIP_FILE}/private.pem ${FILE_CERT_KEY}
# 删除 打完收工
unlink ${ZIP_FILE}.zip
rm -rf ${ZIP_FILE}

`${COMAND_RELOAD}`

证书设置为 自动重申(启用自动验证,重新申请后,证书ID会保持不变,需要账户类型为VIP)

设置定时任务:

crontab -e 创建定时任务 crontab -l 查看配置文件

0 0 1 1-12/3 * root /etc/ssl/zs/ssl_update.sh “从1月到12月,每3个月的每月1日00:00执行./etc/apache2/ssl/ssl.sh文件。”

0 0 1 * * /etc/ssl/zs/ssl_update.sh “每月的1日00:00 执行./etc/apache2/ssl/ssl.sh文件。”