You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何开发Let's Encrypt SSL自动续期脚本并校验日期是否在7天内?

嘿,这两个需求我帮你梳理好了具体的实现方案,都是用Shell脚本搞定的,直接能用:

一、检查指定日期是否处于未来一周内

这里我用Shell脚本实现,和第二个需求的环境统一,方便你维护。核心思路是把日期转换成时间戳,再对比当前时间和未来一周的时间戳范围。

示例脚本

#!/bin/bash

# 接收传入的指定日期(格式示例:"May 9 19:27:44 2018 GMT")
target_date="$1"

# 检查是否传入了日期参数
if [ -z "$target_date" ]; then
    echo "请传入要检查的日期,格式如:\"May 9 19:27:44 2018 GMT\""
    exit 1
fi

# 获取当前时间戳(单位:秒)
current_ts=$(date +%s)
# 计算未来一周的时间戳(7天 = 7*24*3600 秒)
future_week_ts=$((current_ts + 7*24*3600))

# 将指定日期转换为时间戳
# 注意:Linux用GNU date,用-d参数;macOS用BSD date,需替换为下面的注释行
target_ts=$(date -d "$target_date" +%s)
# macOS下请替换为:target_ts=$(date -j -f "%b %d %T %Y %Z" "$target_date" +%s)

# 判断日期是否在未来一周内
if [ $target_ts -gt $current_ts ] && [ $target_ts -le $future_week_ts ]; then
    echo "✅ 指定日期处于未来一周内"
else
    echo "❌ 指定日期不在未来一周内"
fi

使用方法

  1. 保存脚本为check_future_week.sh
  2. 赋予执行权限:chmod +x check_future_week.sh
  3. 运行脚本并传入日期:./check_future_week.sh "May 9 19:27:44 2018 GMT"
二、Let's Encrypt SSL证书自动续期脚本

这个脚本完全按照你的需求来:每日检查证书过期时间,剩余有效期≤7天就自动续期,还加了错误处理和日志提示。

自动续期脚本

#!/bin/bash

# -------------------------- 配置参数 --------------------------
CERT_FILE=~/letsencrypt/www.mydomain.com/cert.pem  # 证书文件路径
DEHYDRATED_CMD=~/dehydrated/dehydrated            # dehydrated工具路径
TARGET_DOMAIN=www.mydomain.com                    # 要续期的域名
LOG_FILE=/var/log/letsencrypt_renew.log           # 日志文件路径
# -------------------------------------------------------------

# 先检查证书文件是否存在
if [ ! -f "$CERT_FILE" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:证书文件 $CERT_FILE 不存在" >> "$LOG_FILE"
    exit 1
fi

# 获取证书过期时间字符串(格式:notAfter=May 9 19:27:44 2018 GMT)
expiry_str=$(openssl x509 -enddate -noout -in "$CERT_FILE")
# 提取纯日期部分(去掉notAfter=前缀)
expiry_date=${expiry_str#notAfter=}

# 将过期日期转换为时间戳
# Linux用GNU date,macOS替换为注释行的命令
expiry_ts=$(date -d "$expiry_date" +%s)
# macOS下替换为:expiry_ts=$(date -j -f "%b %d %T %Y %Z" "$expiry_date" +%s)

# 获取当前时间戳
current_ts=$(date +%s)

# 计算剩余天数(取整数部分)
remaining_days=$(( (expiry_ts - current_ts) / 86400 ))

echo "$(date '+%Y-%m-%d %H:%M:%S') - 证书 $TARGET_DOMAIN 剩余有效期:$remaining_days 天" >> "$LOG_FILE"

# 判断是否需要续期
if [ $remaining_days -le 7 ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 剩余有效期≤7天,开始执行续期..." >> "$LOG_FILE"
    
    # 切换到指定目录并执行续期命令
    cd ~/letsencrypt && "$DEHYDRATED_CMD" --cron --domain "$TARGET_DOMAIN" >> "$LOG_FILE" 2>&1
    
    # 检查续期是否成功
    if [ $? -eq 0 ]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - ✅ 证书续期成功!" >> "$LOG_FILE"
        # 可选:重启Web服务器使新证书生效(根据你的服务修改)
        # systemctl reload nginx >> "$LOG_FILE" 2>&1
        # service apache2 reload >> "$LOG_FILE" 2>&1
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') - ❌ 证书续期失败,请检查日志" >> "$LOG_FILE"
        exit 1
    fi
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 剩余有效期充足,无需续期" >> "$LOG_FILE"
fi

部署步骤

  1. 保存脚本为auto_renew_cert.sh
  2. 赋予执行权限:chmod +x auto_renew_cert.sh
  3. 添加到crontab每日执行(比如每天凌晨2点):
    • 运行crontab -e打开定时任务编辑器
    • 添加一行:0 2 * * * /path/to/auto_renew_cert.sh
    • 保存退出即可

注意事项

  • 确保crontab的环境变量能找到openssl和date命令,若有问题可以在脚本开头添加PATH=/usr/bin:/bin:/usr/sbin:/sbin
  • 续期成功后记得重启你的Web服务器(Nginx/Apache等),脚本里已经留了注释,取消注释并修改成你的服务命令即可
  • 定期查看日志文件/var/log/letsencrypt_renew.log,确保脚本正常运行

内容的提问来源于stack exchange,提问作者DDiran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:25:13