https客户端证书安装及更新,脚本实现

背景:

        目前系统之间的数据交互通过接口实现,配置的地址都是https的,SSL加密认证,增强安全感,但是如果客户端不安装证书的话就会报错,导致失败。证书过期也不知道,后期再排查安装,费时间。

处理方式:

        之前文章提到的,安装对应系统的https证书到使用的JDK环境上。但是后期安装的多了,频次高了,每次都手动安装,费事。所以就编写了脚本实现快速安装。

实现方法:

编写相关脚本文件:install_ssl_certs.sh

#!/bin/bash

source /etc/profile
source ~/.bash_profile

# 用法说明
usage() {
    echo "用法: $0 <域名> [Javahome] [keystorepassword]"
    echo "示例: $0 example.com /usr/lib/jvm/java-11-openjdk-amd64 MyKeystorePassword"
    exit 1
}

# 检查参数数量
if [ $# -lt 1 ]; then
    usage
fi

DOMAIN=$1
JAVAHOME=${2:-${JAVA_HOME}}
#JAVA_HOME="${JAVA_HOME:-${JAVA_HOME}}"
KEYSTOREPASSWORD=${3:-"changeit"}

# 检查 Java 安装目录是否存在
if [ ! -d "$JAVAHOME" ]; then
    echo "错误: Java 安装目录 $JAVAHOME 不存在!"
    exit 1
fi

# 检查 keytool 是否可用
if ! command -v keytool &> /dev/null; then
    echo "错误: keytool 未找到,请确保 Java 已正确安装"
    exit 1
fi

# 检查 openssl 是否可用
if ! command -v openssl &> /dev/null; then
    echo "错误: openssl 未找到,请安装 openssl 工具"
    exit 1
fi

# 创建临时目录
TEMP_DIR=$(mktemp -d)
CERT_FILE="$TEMP_DIR/$DOMAIN.crt"
CA_FILE="$TEMP_DIR/$DOMAIN.ca-bundle"
KEY_FILE="$TEMP_DIR/$DOMAIN.key"
KEYSTORE_PATH="$JAVAHOME/jre/lib/security/cacerts"

# 下载证书
download_certificate() {
    echo "正在下载 $DOMAIN 的 SSL 证书..."
    openssl s_client -showcerts -connect $DOMAIN:443 -servername $DOMAIN </dev/null | \
    openssl x509 -outform PEM > "$CERT_FILE"
    
    if [ ! -f "$CERT_FILE" ]; then
        echo "错误: 下载证书失败"
        exit 1
    fi
}

# 安装证书到 Java 信任库
install_certificate() {
    echo "正在安装证书到 Java 信任库..."
    keytool -importcert -alias $DOMAIN -file "$CERT_FILE" -keystore "$KEYSTORE_PATH" \
    -storepass "$KEYSTOREPASSWORD" -noprompt
    
    if [ $? -ne 0 ]; then
        echo "错误: 安装证书失败"
        exit 1
    fi
}

# 检查证书有效期
check_certificate_expiry() {
    echo "正在检查证书有效期..."
    expiry_date=$(openssl x509 -in "$CERT_FILE" -noout -enddate | cut -d= -f2)
    expiry_timestamp=$(date -d "$expiry_date" +%s)
    current_timestamp=$(date +%s)
    days_left=$(( (expiry_timestamp - current_timestamp) / 86400 ))
    
    if [ $days_left -le 0 ]; then
        echo "警告: 证书已过期!"
        return 1
    elif [ $days_left -le 30 ]; then
        echo "警告: 证书将在 $days_left 天后过期!"
        return 0
    else
        echo "证书有效,剩余 $days_left 天"
        return 0
    fi
}

# 更新过期证书
update_expired_certificate() {
    echo "正在更新过期证书..."
    keytool -delete -alias $DOMAIN -keystore "$KEYSTORE_PATH" -storepass "$KEYSTOREPASSWORD"
    install_certificate
}

# 主程序
download_certificate

# 检查证书是否已存在
if keytool -list -keystore "$KEYSTORE_PATH" -storepass "$KEYSTOREPASSWORD" | grep -q "$DOMAIN"; then
    echo "证书已存在,正在检查有效期..."
    check_certificate_expiry
    if [ $? -ne 0 ]; then
        update_expired_certificate
    fi
else
    echo "证书不存在,正在安装..."
    install_certificate
fi

# 清理临时文件
rm -rf "$TEMP_DIR"
echo "操作完成!"

使用方法:

./install_ssl_certs.sh <域名> [Javahome] [keystorepassword]

<域名>  必填

[Javahome] 代码有默认的  可以根据实际填写

[keystorepassword] 密码  默认:changeit

1、若没有安装过,则安装

    2、若安装过,则覆盖安装。适用场景:过期证书的替换

根据之前的脚本,查询到已过期的

覆盖安装:

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值