AlexRomeo
发布于 2024-06-20 / 185 阅读
0
0

自动同步证书脚本

背景

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

评论