客户总想省钱,用免费安全证书。但有3个月到1年过期问题,我们如何提醒及时购买,而不影响使用
以下是一个用于检测HTTPS域名SSL证书过期并自动发送邮件提醒的Shell脚本示例:
第一步:准备脚本
#!/bin/bash
# 配置参数
THRESHOLD_DAYS=30 # 过期阈值(天)
EMAIL_ADDR="admin@example.com" # 接收提醒的邮箱
DOMAINS_FILE="domains.txt" # 域名列表文件路径
LOG_FILE="/var/log/ssl_check.log" # 日志文件路径
# 邮件主题和内容模板
SUBJECT_PREFIX="SSL证书过期警告"
MAIL_CONTENT="域名:%s 的SSL证书将在 %d 天后过期。\n过期日期:%s\n请及时续订或购买新的SSL证书。"
# 检查依赖项
command -v openssl >/dev/null 2>&1 || { echo "openssl 未安装,请先安装。"; exit 1; }
command -v mailx >/dev/null 2>&1 || { echo "mailx 未安装,请先安装。"; exit 1; }
# 日志记录函数
log() {
echo "$(date "+%Y-%m-%d %H:%M:%S") - $1" >> "$LOG_FILE"
}
while read domain; do
# 去除可能的空白字符
domain=$(echo "$domain" | xargs)
# 跳过空行和注释行
if [[ -z "$domain" || "$domain" == \#* ]]; then
continue
fi
log "正在检查域名: $domain"
# 获取证书过期时间
expiry_date=$(echo | openssl s_client -servername "$domain" -connect "$domain":443 2>/dev/null | openssl x509 -noout -dates 2>/dev/null | grep 'notAfter' | cut -d= -f2)
if [ -z "$expiry_date" ]; then
log "错误:无法获取 $domain 的证书信息"
continue
fi
# 转换日期为时间戳(Linux系统)
expiry_timestamp=$(date -d "$expiry_date" +%s 2>/dev/null)
if [ -z "$expiry_timestamp" ]; then
# macOS系统处理
expiry_date_formatted=$(echo "$expiry_date" | awk '{print $1,$2,$3,$4,$5}')
expiry_timestamp=$(date -j -f "%b %d %H:%M:%S %Y" "$expiry_date_formatted" +%s)
fi
current_timestamp=$(date +%s)
days_remaining=$(( (expiry_timestamp - current_timestamp) / 86400 ))
log "域名: $domain 剩余天数: $days_remaining"
# 检查是否即将过期
if [ "$days_remaining" -le "$THRESHOLD_DAYS" ]; then
mail_subject="$SUBJECT_PREFIX: $domain 剩余 $days_remaining 天"
mail_body=$(printf "$MAIL_CONTENT" "$domain" "$days_remaining" "$expiry_date")
echo -e "$mail_body" | mailx -s "$mail_subject" "$EMAIL_ADDR"
if [ $? -eq 0 ]; then
log "已发送提醒邮件:$domain"
else
log "邮件发送失败:$domain"
fi
fi
done < "$DOMAINS_FILE"
log "检查完成"
第二步:使用说明
-
准备域名列表
创建domains.txt
文件,每行一个域名(支持以#开头的注释行):example.com github.com # 这是一个注释 google.com
-
安装依赖
- 确保系统已安装
openssl
和mailx
- Ubuntu/Debian:
sudo apt-get install openssl mailutils
- CentOS/RHEL:
sudo yum install openssl mailx
- 确保系统已安装
-
配置邮件发送
根据系统配置邮件服务(如使用外部SMTP服务器,需修改/etc/mail.rc
)。 -
设置定时任务
使用crontab每天自动运行:# 每天上午9点运行 0 9 * * * /path/to/ssl_check.sh
第三步:功能说明
- 自动检测证书有效期:通过OpenSSL获取证书信息
- 多域名支持:从文件读取域名列表
- 动态阈值设置:可配置过期提醒阈值(默认30天)
- 邮件提醒:发送包含详细信息的提醒邮件
- 日志记录:记录检测过程和结果
- 跨平台支持:兼容Linux和macOS系统
最后:注意事项
-
确保脚本有执行权限:
chmod +x ssl_check.sh
-
首次运行前建议手动测试:
./ssl_check.sh
-
如果遇到证书验证问题,可能需要添加
-verify_quiet
参数忽略证书链验证 -
邮件服务需要正确配置,建议测试邮件功能:
echo "测试邮件" | mailx -s "测试主题" your@email.com
可以根据实际需求调整阈值、邮件模板和日志路径等参数。