Linux服务器更换SSL证书命令
Linux服务器更换SSL证书命令

Linux服务器更换SSL证书命令

前情提要

因为服务器马上要一年了,SSL证书也即将到期,腾讯云也短信提醒我,然后打算登录腾讯云后,发现证书有效期变为90天,这样的话,更换证书的频次明显增加了。

证书有效期的调整好像不限于云服务器商,专注于SSL的厂商也都将免费证书调整为90了,如SSL.zerosslsslforfree等厂商,都可以看到免费使用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容器,如需重启其他的服务还需要自行配置。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注