Linux怎么用Shell脚本定期轮询检查SSL证书即将过期的天数

大晨吖_9272

大晨吖_9272

2026-10-03

558人浏览

原创

核心思路是提取证书notafter时间并转为unix时间戳,与当前时间比较得剩余天数;关键命令需加-servername支持sni、多处2>/dev/null静默容错,并封装为自动识别域名/本地文件的shell函数,配合低频定时、日志记录、去重告警及webhook通知。

linux怎么用shell脚本定期轮询检查ssl证书即将过期的天数

用 openssl 提取证书过期时间并计算剩余天数

核心思路是:从域名或本地证书文件中提取 notAfter 时间,转为 Unix 时间戳,再与当前时间比较。关键命令链是:openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate。注意必须加 -servername(SNI),否则对虚拟主机可能拿到错误证书;2>/dev/null 是为了屏蔽连接警告(如自签名、握手失败等),避免干扰解析。

提取后得到类似 notAfter=Jan 15 12:34:56 2026 GMT 的输出,用 awk 和 date -d 转换即可:

expiry=$(echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | awk -F'= ' '{print $2}')
days_left=$(( ($(date -d "$expiry" +%s 2>/dev/null) - $(date +%s)) / 86400 ))

这里 2>/dev/null 多处出现,不是偷懒——任何一步失败(连不上、无响应、证书格式异常)都会导致变量为空或报错,必须静默兜底。

写成可复用的 Shell 函数并支持多种输入源

单个域名检查不够实用,脚本得能处理:远程域名、本地 PEM 文件、甚至多个目标。建议封装为函数,接受一个参数,并自动判断类型:

  • 如果参数含 :(如 example.com:443),走 openssl s_client 远程检查
  • 如果参数以 / 开头且文件存在,当作本地证书路径,用 openssl x509 -in $file -noout -enddate
  • 否则默认按域名处理(补 :443)

这样调用就灵活:check_cert example.com、check_cert /etc/ssl/certs/my.crt、check_cert api.example.org:8443。函数内务必校验 openssl 命令是否存在,以及 date -d 是否支持 GNU 扩展(macOS 的 date 不兼容,需用 gdate 替代)。

Alpine Linux
Alpine Linux

获取最新发布版本;聚合最新版本架构

下载

定时轮询时如何避免误报和资源浪费

直接用 crontab 每分钟跑一次 openssl s_client 很危险:大量 TCP 握手会触发目标 WAF 限流,也可能被当成探测攻击。实际应控制频率与并发:

  • 对生产域名,建议每 6–24 小时检查一次,用 0 */6 * * * 这类低频策略
  • 多个域名不要串行阻塞执行,可用 timeout 10s check_cert domain1 & 后台+超时保护
  • 结果必须落盘(如追加到 /var/log/cert-check.log),带时间戳和原始输出,方便排查“为什么某次没告警”
  • 别只依赖天数阈值(如 days_left ),要加状态去重:连续两次都 <code> 才发通知,避免网络抖动导致的瞬时误判

告警逻辑不能只靠 echo 或 mail

Shell 脚本里写 echo "SSL expires in $days_left days" | mail -s "ALERT" admin@example.com 看似简单,但实际运维中几乎不可靠:

  • mail 命令在多数现代 Linux 发行版默认未安装,且依赖本地 MTA(如 sendmail/postfix)配置正确
  • 邮件可能进垃圾箱,无送达确认,更无法追踪是否已处理
  • 真正可用的方式是调用 Webhook:用 curl -X POST -H "Content-Type: application/json" -d '{"text":"SSL for example.com expires in '$days_left' days"}' https://hooks.slack.com/services/XXX

如果必须用邮件,至少加上 if [ "$days_left" -lt 30 ] && ! grep -q "$(date +%Y-%m-%d)-example.com" /tmp/cert_alerted; then ... echo "$(date +%Y-%m-%d)-example.com" >> /tmp/cert_alerted; fi,防止每天重复轰炸。

证书时间解析看似简单,但 openssl 输出格式随版本微调、GMT 时区处理、系统 date 实现差异、网络超时边界——这些细节堆在一起,才是轮询脚本能长期稳定跑下去的关键。

相关专题

更多
SSL检测工具介绍
SSL检测工具介绍

SSL检测工具有SSL Labs、SSL Check、SSL Server Test、SSLMate、SSL/TLS Analyzer等。详细介绍:1、SSL Labs是一个由Qualys提供的在线SSL检测工具,可以评估服务器证书的部署情况、加密套件、协议支持等方面的安全性,它提供了一个详细的报告,包括证书的颁发者、有效期、安全性配置等;2、SSL Check等等。

2023.10.20

710

3

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

3790

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3273

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2393

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

5730

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

5382

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3193

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

2685

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

2899

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
尚观shell视频教程
尚观shell视频教程

共8课时 | 1.9万人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习