开源项目-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
作者
Cikaros
发布于
2023年9月14日
许可协议