开源项目-SSL自动续约脚本
acme.sh 是一个用于自动化管理 Let’s Encrypt SSL/TLS 证书的命令行工具。它允许用户在其服务器上轻松获取、更新和部署 SSL/TLS 证书,以确保网站和应用程序的安全性和加密通信。
介绍
以下是 acme.sh 的一些关键特点和用途:
- 自动证书签发和更新:acme.sh 可以自动获取 Let’s Encrypt 证书,并设置定时任务以确保证书在到期前自动续订。
- 多种 DNS API 支持:它支持多种 DNS 提供商的 API,使您能够通过 DNS 验证方式获取证书,而不仅仅是通过 HTTP 验证。
- 多种证书格式:acme.sh 支持生成各种格式的证书,包括 PEM、DER、PKCS12 等。
- 灵活的安装选项:您可以选择将证书安装到不同类型的 Web 服务器(如Apache、Nginx、Caddy等)或其他应用程序中。
- 多环境支持:它可以在各种操作系统和环境中运行,包括 Linux、macOS 和 Windows。
- 插件系统:acme.sh 具有丰富的插件系统,允许用户编写自定义插件来执行各种操作,从而扩展其功能。
- 完全开源:acme.sh 是一个开源项目,可以在 GitHub 上找到其源代码,并受到活跃的社区支持。
自主续约
以下来自ChatGPT,它会在续约证书之前备份旧证书,然后将新证书放回原始位置:
#!/bin/bash
# 指定证书文件夹路径
cert_dir="/path/to/certificates"
# 指定证书备份文件夹路径
backup_dir="/path/to/backup"
# 指定要续约的域名和相应的启动和停止服务的命令
declare -A domain_start_map
declare -A domain_stop_map
# 启动服务的映射
domain_start_map["example.com"]="docker start nginx"
domain_start_map["anotherdomain.com"]="docker start myapp"
# 停止服务的映射
domain_stop_map["example.com"]="docker stop nginx"
domain_stop_map["anotherdomain.com"]="docker stop myapp"
# 检查是否已安装 acme.sh
if [ ! -f "$HOME/.acme.sh/acme.sh" ]; then
echo "acme.sh 未安装,开始下载并安装..."
# 使用 curl 下载 acme.sh 脚本
curl https://get.acme.sh | sh
sudo apt-get -y install socat
if [ ! -f "$HOME/.acme.sh/acme.sh" ]; then
echo "acme.sh 安装失败,请手动安装"
exit 1
fi
/root/.acme.sh/acme.sh --set-default-ca --server letsencrypt
fi
# 遍历每个域名和相应的服务命令
for domain in "${!domain_stop_map[@]}"; do
cert_file="$cert_dir/$domain.crt"
key_file="$cert_dir/$domain.key"
stop_service_command="${domain_stop_map[$domain]}"
start_service_command="${domain_start_map[$domain]}"
# 检查证书和私钥文件是否存在
if [ -f "$cert_file" ] && [ -f "$key_file" ]; then
echo "证书和私钥文件存在,继续..."
# 检查证书是否过期
if openssl x509 -checkend 0 -noout -in "$cert_file"; then
echo "证书 $domain 未过期,无需续约"
else
echo "证书 $domain 已过期,正在续约..."
# 执行用户指定的停止服务命令
echo "停止服务: $stop_service_command"
eval "$stop_service_command"
# 备份旧证书和私钥文件
backup_dir="/path/to/backup"
mkdir -p "$backup_dir"
timestamp=$(date +"%Y%m%d%H%M%S")
cp "$cert_file" "$backup_dir/$domain.$timestamp.crt"
cp "$key_file" "$backup_dir/$domain.$timestamp.key"
# 使用 acme.sh 续约证书并放回原始位置
/root/.acme.sh/acme.sh --renew -d $domain --force
acme_sh_cert_dir="/root/.acme.sh/$domain"
new_cert_file="$acme_sh_cert_dir/fullchain.cer"
new_key_file="$acme_sh_cert_dir/$domain.key"
cp "$new_cert_file" "$cert_file"
cp "$new_key_file" "$key_file"
# 执行用户指定的启动服务命令
echo "启动服务: $start_service_command"
eval "$start_service_command"
echo "证书 $domain 续约完成"
fi
else
echo "证书或私钥文件不存在 for $domain,开始申请新证书..."
# 执行用户指定的停止服务命令
echo "停止服务: $stop_service_command"
eval "$stop_service_command"
# 使用 acme.sh 申请新证书并放回指定位置
/root/.acme.sh/acme.sh --issue -d $domain --standalone
/root/.acme.sh/acme.sh --install-cert -d $domain \
--key-file "$key_file" \
--fullchain-file "$cert_file"
# 执行用户指定的启动服务命令
echo "启动服务: $start_service_command"
eval "$start_service_command"
echo "新证书 $domain 已申请并放置在指定位置"
fi
done
请根据您的实际情况更新脚本中的路径和命令,并使用 cron
作业来定期运行此脚本以执行证书续约和服务操作。
要定期执行此脚本,您可以使用 cron
作业。运行 crontab -e
来编辑您的用户的 cron
作业,然后添加一个类似于以下的行来设置定期执行:
0 0 * * * /path/to/renew_certificates.sh
这将在每天午夜(00:00)执行脚本。确保将 /path/to/renew_certificates.sh
替换为实际的脚本路径。此设置将每天检查证书并执行续约操作(如果需要)。
开源项目-SSL自动续约脚本
https://blog.cikaros.top/doc/14c8d1db.html