更新SSL证书后推送其他服务器(包含1Panel更新证书)

在日常服务器运维中,SSL 证书的更新是保障网站安全的重要环节。为了确保所有服务都能及时更新到最新的证书版本,我们通常需要将更新后的证书推送到其他服务器,并在特定情况下更新如 1Panel 这类管理平台的证书。

更新SSL证书后推送其他服务器

准备工作

1. 先设置需要推送的服务器免密登录

  1. 生成SSH密钥对(在本地机器执行)

    ssh-keygen -t rsa -b 4096 -C "jxqg597@gmail.com"
    
    • 作用:生成一个RSA类型的SSH密钥对,密钥长度为4096位,注释为指定的邮箱地址。
  2. 将公钥复制到远程服务器(在本地机器执行)

    ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.196.1
    
    • 作用:将本地生成的公钥(id_rsa.pub)复制到远程服务器的 root用户账户下,并添加到 ~/.ssh/authorized_keys文件中,以便实现免密登录。
  3. 设置远程服务器的SSH目录权限(在远程机器执行)

    [root@host .ssh]$ chmod 600 authorized_keys
    [root@host .ssh]$ chmod 700 ~/.ssh
    
    • 作用
      • chmod 600 authorized_keys:设置 authorized_keys文件的权限为只读(用户可读、不可写,组和其他用户无权限)。
      • chmod 700 ~/.ssh:设置 .ssh目录的权限为可读、可写、可执行(用户可访问,组和其他用户无权限)。
  4. 编辑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:启用公钥认证。
  5. 重启SSH服务(在远程机器执行)

    service sshd restart
    
    • 作用:重启SSH服务,使配置文件的更改生效。
    • 执行位置:远程机器。

2. 准备推送脚本

  1. 推送脚本,并执行更新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"
  1. 其他如果使用了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
  1. 新建配置文件/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
c2agtv51.0yz.png

3.执行推送脚本

./push_ssl.sh

4.Cron定时任务或者通过1Panel更新证书后触发脚本

  1. 定时任务
crontab -e
0 1,9,17 * * * /push_ssl.sh
chmod +x /push_ssl.sh
  1. 1Panel可以搜索一下教学,在面板证书编辑里添加上执行脚本路径就行
bash /push_ssl.sh
Comment