如何开发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
使用方法
- 保存脚本为
check_future_week.sh - 赋予执行权限:
chmod +x check_future_week.sh - 运行脚本并传入日期:
./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
部署步骤
- 保存脚本为
auto_renew_cert.sh - 赋予执行权限:
chmod +x auto_renew_cert.sh - 添加到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
相关产品推荐
相关产品推荐

