更新SSL证书后推送其他服务器
准备工作
1. 先设置需要推送的服务器免密登录
-
生成SSH密钥对(在本地机器执行)
ssh-keygen -t rsa -b 4096 -C "jxqg597@gmail.com"
- 作用:生成一个RSA类型的SSH密钥对,密钥长度为4096位,注释为指定的邮箱地址。
-
将公钥复制到远程服务器(在本地机器执行)
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.196.1
- 作用:将本地生成的公钥(
id_rsa.pub
)复制到远程服务器的root
用户账户下,并添加到~/.ssh/authorized_keys
文件中,以便实现免密登录。
- 作用:将本地生成的公钥(
-
设置远程服务器的SSH目录权限(在远程机器执行)
[root@host .ssh]$ chmod 600 authorized_keys [root@host .ssh]$ chmod 700 ~/.ssh
- 作用:
chmod 600 authorized_keys
:设置authorized_keys
文件的权限为只读(用户可读、不可写,组和其他用户无权限)。chmod 700 ~/.ssh
:设置.ssh
目录的权限为可读、可写、可执行(用户可访问,组和其他用户无权限)。
- 作用:
-
编辑SSH配置文件(在远程机器执行)
nano /etc/ssh/sshd_config # 解除以下注释 AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 PermitRootLogin yes PubkeyAuthentication yes
- 作用:编辑SSH服务器的配置文件,进行以下设置:
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
:指定授权密钥文件的路径。PermitRootLogin yes
:允许root
用户通过SSH登录。PubkeyAuthentication yes
:启用公钥认证。
- 作用:编辑SSH服务器的配置文件,进行以下设置:
-
重启SSH服务(在远程机器执行)
service sshd restart
- 作用:重启SSH服务,使配置文件的更改生效。
- 执行位置:远程机器。
2. 准备推送脚本
- 推送脚本,并执行更新1panel证书功能。添加了telegram bot提示
#!/bin/bash
# 定义服务器列表
SERVERS=(
#登录用户@IP地址
"root@1.12.123.333" # server1
"root@2.12.321.123" # server2
)
# 定义本地要推送的文件夹和远程目标路径
LOCAL_FOLDER="/root/jxqggg.com/"
REMOTE_FOLDER="/root/"
# 日志文件路径
LOG_FILE="/root/log/push_tls.log"
# Telegram通知URL(替换为你实际的Telegram API URL)
TELEGRAM_URL="https://api.telegram.org/bot<bot_id>/sendMessage"
TELEGRAM_CHAT_ID="<chat_id>" # 替换为你的Telegram聊天ID
# 清空或创建日志文件
> "$LOG_FILE"
# 函数:发送Telegram通知
send_telegram_notification() {
local message="$1"
curl -s -X POST "$TELEGRAM_URL" \
-d chat_id="$TELEGRAM_CHAT_ID" \
-d text="$message" > /dev/null 2>&1
}
# 循环遍历服务器列表并推送文件
for SERVER in "${SERVERS[@]}"; do
echo "正在推送文件夹到 $SERVER..." | tee -a "$LOG_FILE"
scp -r "$LOCAL_FOLDER" "$SERVER":"$REMOTE_FOLDER" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
echo "推送到 $SERVER 成功" | tee -a "$LOG_FILE"
# 检查远程脚本是否存在
ssh "$SERVER" "test -f /root/script/upload_1panel_ssl.sh" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
# 远程脚本存在,执行脚本
ssh "$SERVER" "nohup /root/script/upload_1panel_ssl.sh >> /root/script/upload_ssl.log 2>&1 &"
if [ $? -eq 0 ]; then
echo "远程脚本 /root/script/upload_1panel_ssl.sh 执行成功" | tee -a "$LOG_FILE"
else
echo "远程脚本 /root/script/upload_1panel_ssl.sh 执行失败" | tee -a "$LOG_FILE"
send_telegram_notification "警告: 远程服务器 $SERVER 的脚本执行失败。请检查日志:$LOG_FILE"
fi
else
echo "远程脚本 /root/script/upload_1panel_ssl.sh 不存在,跳过执行" | tee -a "$LOG_FILE"
fi
else
echo "推送到 $SERVER 失败" | tee -a "$LOG_FILE"
send_telegram_notification "错误: 推送到服务器 $SERVER 失败。请检查日志:$LOG_FILE"
fi
done
echo "所有服务器推送完成。" | tee -a "$LOG_FILE"
- 其他如果使用了1Panel进行管理Nginx域名证书,则触发更新证书信息
在远程机器新建脚本/root/script/upload_1panel_ssl.sh
#!/bin/bash
# 加载配置文件
CONFIG_FILE="./upload_1panel_ssl.cfg"
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
else
echo "配置文件 $CONFIG_FILE 不存在,退出!"
exit 1
fi
# 登录请求 JSON 数据
LOGIN_DATA=$(cat <<EOF
{
"name": "$USERNAME",
"password": "$PASSWORD",
"language": "zh",
"authMethod": "jwt"
}
EOF
)
# 使用 curl 发送登录请求,并输出详细请求内容
RESPONSE=$(curl -s -v -X POST "$LOGIN_URL" \
-H "Content-Type: application/json" \
-H "EntranceCode: $ENTRANCE_CODE" \
-d "$LOGIN_DATA" 2>&1)
echo "登录请求响应: $RESPONSE"
# 解析返回的 token
TOKEN=$(echo "$RESPONSE" | grep -Po '(?<="token":")[^"]*')
# 检查是否登录成功
if [ -n "$TOKEN" ]; then
echo "登录成功,token: $TOKEN"
# 构建上传证书的请求数据
UPLOAD_DATA=$(cat <<EOF
{
"privateKey": "",
"certificate": "",
"privateKeyPath": "$PRIVATE_KEY_PATH",
"certificatePath": "$CERTIFICATE_PATH",
"type": "local",
"sslID": $SSL_ID,
"description": "$DESCRIPTION"
}
EOF
)
# 发送证书上传请求
UPLOAD_RESPONSE=$(curl -s -X POST "$UPLOAD_URL" \
-H "PanelAuthorization: $TOKEN" \
-H "Content-Type: application/json" \
-d "$UPLOAD_DATA")
# 输出上传结果
echo "证书上传响应: $UPLOAD_RESPONSE"
else
echo "登录失败,请检查用户名或密码"
echo "失败响应: $RESPONSE"
fi
- 新建配置文件
/root/script/upload_1panel_ssl.cfg
# config.cfg
#1panel的登录用户名称
USERNAME="1panel"
#1panel的登陆密码
PASSWORD="1233211234567"
#base64的安全入口码
ENTRANCE_CODE=""
#1panel的登录地址
LOGIN_URL="https://1panel.jxqggg.com/api/v1/auth/login"
UPLOAD_URL="https://1panel.jxqggg.com/api/v1/websites/ssl/upload"
#远程推送的证书
PRIVATE_KEY_PATH="/root/jxqggg.com/privkey.pem"
CERTIFICATE_PATH="/root/jxqggg.com/fullchain.pem"
#手动创建证书在面板里的ID(需要打开F12后点击证书详情)
SSL_ID=1
#备注 任意内容
DESCRIPTION="sync from certd:jxqggg.com"
需要更新的手动创建证书的ID
3.执行推送脚本
./push_ssl.sh
4.Cron定时任务或者通过1Panel更新证书后触发脚本
- 定时任务
crontab -e
0 1,9,17 * * * /push_ssl.sh
chmod +x /push_ssl.sh
- 1Panel可以搜索一下教学,在面板证书编辑里添加上执行脚本路径就行
bash /push_ssl.sh