背景:
目前系统之间的数据交互通过接口实现,配置的地址都是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、若安装过,则覆盖安装。适用场景:过期证书的替换
根据之前的脚本,查询到已过期的
覆盖安装: