背景
ssl证书通过acme自动申请,约3个月自动续签一次证书,将申请下来的证书自动同步给其他需要使用的主机。
环境介绍
系统:CentOS 7.8
当前主机与其他主机之间可以免密访问。
正文
脚本内容
#!/bin/bash
# 目标目录
target_dir="/data/etc/nginx-proxy-manager/letsencrypt/archive/npm-4"
# 文件名称
# 状态文件默认与脚本运行时的目录保持一致,可自行修改
# old开头表示旧文件,用于对比和变量pri_key文件变化,若变化则将新证书文件分发给其他主机。
state_file="./file_state.txt"
old_pri_key=''
old_pub_crt=''
pri_key=''
pub_crt=''
# 从状态文件中读取上次的值
function loadState(){
if [ -f "$state_file" ]; then
old_pri_key=$(sed -n '1p' "$state_file")
old_pub_crt=$(sed -n '2p' "$state_file")
fi
}
# 将当前的值写入状态文件
function saveState(){
echo "$old_pri_key" > "$state_file"
echo "$old_pub_crt" >> "$state_file"
}
# 需要更新的证书的主机信息
function sync_host_machine(){
# 中继信息
# hs中继
alex_relaying=192.168.215.247
# aliyun
alex_aliyun=172.22.5.178
# 同步
scp -P 2122 $1 root@$alex_relaying:/home/dev.alexromeo.net/dev.alexromeo.net.key
scp -P 2122 $2 root@$alex_relaying:/home/dev.alexromeo.net/dev.alexromeo.net.crt
# 未使用-P参数是因为主机使用的默认端口号
scp $1 root@$alex_aliyun:/data/nginx-proxy-manager/data/custom_ssl/npm-2/privkey.pem
scp $2 root@$alex_aliyun:/data/nginx-proxy-manager/data/custom_ssl/npm-2/fullchain.pem
}
# 检查证书函数
function checkSSL(){
# 文件前缀,用于查找文件。
pri_key_prefix='privkey'
pub_crt_prefix='fullchain'
# 获取路径下的当前文件名称
pri_key=$(ls $target_dir/${pri_key_prefix}* | tail -n 1)
pub_crt=$(ls $target_dir/${pub_crt_prefix}* | tail -n 1)
#echo "当前私钥文件: $pri_key"
#echo "当前证书文件: $pub_crt"
# 如果证书文件信息与上次保存的证书文件信息不同则更新
if [ "${old_pri_key}x" != "${pri_key}x" ] || [ "${old_pub_crt}x" != "${pub_crt}x" ]; then
# 发送文件到其他的服务器进行更新
#echo "准备将证书文件同步更新到其他主机"
sync_host_machine $pri_key $pub_crt
# 主机状态更新完成后,保存状态,调用函数
saveState
# 更新旧证书文件信息状态
old_pri_key=${pri_key}
old_pub_crt=${pub_crt}
echo -e "\n"
echo -e "`date +'%F %H:%M:%S'`: \n证书同步完成,进入持续巡检状态,下次检查1小时后。"
else
# 打印运行日志
echo "`date +'%F %H:%M:%S'`:证书未更新,进入持续巡检状态,下次检查1小时后"
fi
}
# 加载上次运行的状态
loadState
# 检测证书更新(每小时检测一次)
while true; do
checkSSL
sleep 3600
done