前情提要
因为服务器马上要一年了,SSL证书也即将到期,腾讯云也短信提醒我,然后打算登录腾讯云后,发现证书有效期变为90天,这样的话,更换证书的频次明显增加了。
证书有效期的调整好像不限于云服务器商,专注于SSL的厂商也都将免费证书调整为90了,如SSL.、zerossl、sslforfree等厂商,都可以看到免费使用90天的字样,也因此让我想要写一个证书的批量替换命令。
后续只需要将免费证书传到服务器端,然后直接该命令即可完成文件的替换。
Shell完整代码
#!/usr/bin/env bash
# 获取当前目录
CERT_DIR="$(pwd)"
echo "当前目录: $CERT_DIR"
# 查找当前目录下的证书文件,并提取它们的文件名
CERT_FILES=$(find "$CERT_DIR" -name "*.com*")
# 如果未找到则提示
if [ -z "$CERT_FILES" ]; then
echo "未找到证书文件"
exit 1
fi
# 将所有找到的证书文件名提取到一个数组中
# 声明存储数组并存储证明的文件名称
declare -a CERT_NAMES
for FILE in $CERT_FILES; do
BASE_NAME=$(basename "$FILE")
CERT_NAMES+=("$BASE_NAME")
done
# 输出找到的证书文件名
echo "找到的证书文件名: ${CERT_NAMES[@]}"
# 查找系统中包含相同证书文件的目录,并去重
declare -a SRC_ADDRS
# 声明存储数组
for CERT_NAME in "${CERT_NAMES[@]}"; do
DIRS=$(find / -name "$CERT_NAME" -exec dirname {} \; 2>/dev/null | sort | uniq)
for DIR in $DIRS; do
SRC_ADDRS+=("$DIR")
done
done
# 去重目录
SRC_ADDRS=($(echo "${SRC_ADDRS[@]}" | tr ' ' '\n' | sort | uniq | tr '\n' ' '))
# 检查是否找到了任何目录
if [ -z "${SRC_ADDRS[*]}" ]; then
echo "未找到任何证书文件的目标目录"
exit 1
fi
# 输出找到的证书目录
echo "找到的证书目录:"
for SRC_ADDR in "${SRC_ADDRS[@]}"; do
echo "$SRC_ADDR"
done
# 复制证书文件到找到的目录中
for DIR in "${SRC_ADDRS[@]}"; do
echo "复制证书到: $DIR"
cp -f "$CERT_DIR"/*.com* "$DIR"
done
# 尝试重启 Apache 和 Nginx 服务
echo "重启 Apache 和 Nginx 服务"
if systemctl is-active --quiet apache2; then
systemctl restart apache2 && echo "Apache 重启成功" || echo "Apache 重启失败"
fi
if systemctl is-active --quiet nginx; then
systemctl restart nginx && echo "Nginx 重启成功" || echo "Nginx 重启失败"
fi
# 尝试重启所有 Docker 容器
echo "重启所有 Docker 容器"
docker ps -q | xargs -r docker restart && echo "所有 Docker 容器重启成功" || echo "Docker 容器重启失败"
echo "证书替换完成"
踩坑问题
1、注意,该Shell代码需要在服务器端含有新的SSL证书的文件夹下进行替换。
2、使用scp命令将下载的SSL证书传到服务器后,记得使用哈希值进行校验,避免出现SSL证书未替换成功,反而将老的SSL证书替换到各系统上。
Mac端哈希值校验:
shasum -a 256 文件名
Linux端哈希值校验:
sha256sum 文件名
3、该Shell在替换SSL证书后,会重启主流的Apache、Nginx以及Docker容器,如需重启其他的服务还需要自行配置。