SSL证书有效期正在逐年缩短,今年3月15日之前购买有效期是1年,3月15日之后购买的有效期只有200天,2027年缩短到100天,最终2029年有效期会缩短到47天。
作为运维人员,如果你也像我一样,手里有好几百个使用https的域名,部署位置也不统一,每年换ssl证书都担心漏换,那今天送你一段shell脚本,仅10来行就能解决漏换问题。
这是一个检测证书有效期的脚本,前面先讲下脚本如何工作,如果不想看也可以直接跳到文末复制脚本运行即可。
1 通过openssl来读取证书信息
[root@vm ~]# openssl s_client -connect www.baidu.com:443 -servername www.baidu.com -showcerts </dev/null 2>/dev/null | openssl x509 -dates -nooutnotBefore=Jul 907:01:022025 GMTnotAfter=Aug 1007:01:012026 GMT
参数说明:
openssl s_client, OpenSSL 的客户端工具,用于建立 SSL连接
-connect www.baidu.com:443, 指定要连接的目标域名 + 端口
-servername www.baidu.com, 指定servername
-showcerts, 输出完整的证书链
</dev/null, 关闭标准输入不等待用户输入直接输出证书并退出
2>/dev/null, 重定向错误输出到空(过滤连接过程中的警告 / 调试信息)
openssl x509, 管道传递证书内容,用 x509 工具解析
-dates, 仅输出证书的生效时间(notBefore)和过期时间(notAfter)
-noout, 不输出证书的原始编码内容,否则输出内容过多会乱
2 提取证书过期时间
grep "notAfter" | cut -d'=' -f 2notAfter 这一行是证书的过期时间,通过grep取出这一行,通过cut命令指定分隔符为“=”,输出分割后的第二列,即过期时间 Aug 1007:01:012026 GMT
3 将获取的时间转换为unix时间戳
Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,这里转换成时间戳方便后续计算时间。
[root@vm ~]# date -d "Aug 10 07:01:01 2026 GMT" +%s1786345261
date -d 是 Linux 中用于显示指定日期或时间的命令。它允许用户通过字符串格式化来解析和显示特定的日期和时间。
+%s 将解析后的时间转换为 Unix 时间戳
4 完整代码
#命令行执行sh ssl_check.sh domain.txt 2>/dev/null#sh ssl_check.sh domain.txt#DOMAIN="xx.yy.com" #域名#PORT=443 #端口#域名文件domain.txt格式xx.yy.com:443for i in `cat $1`;doDOMAIN=`echo$i|awk -F ':''{print $1}'`;PORT=`echo$i | awk -F ':''{print $2}'` ;# 获取SSL证书信息SSL_CERT_INFO=$(openssl s_client -connect ${DOMAIN}:${PORT} -servername ${DOMAIN} -showcerts </dev/null 2>/dev/null | openssl x509 -dates -noout)# 提取证书有效期结束时间CERT_END_DATE=$(echo"${SSL_CERT_INFO}" | grep "notAfter" | cut -d'=' -f 2)# 将时间转换为Unix时间戳方便后续计算剩余天数END_TIMESTAMP=$(date -d "${CERT_END_DATE}" +%s)#当前系统时间CURRENT_TIMESTAMP=$(date +%s)# 计算剩余天数CERT_DAYS_REMAINING=$(( (${END_TIMESTAMP} - ${CURRENT_TIMESTAMP}) / 86400 ))#echo $i $CERT_DAYS_REMAINING#正在检测时输出.....echo -n .#证书有效期小于20天且不等于0,等于0的可能是没有ssl证书if [ $CERT_DAYS_REMAINING -lt 20 ] && [ $CERT_DAYS_REMAINING -ne 0 ]; thenecho"${DOMAIN}${PORT} 剩余${CERT_DAYS_REMAINING}天"fidone
5 运行脚本
把脚本文件另存为ssl_check.sh
准备一份域名清单,准备一份域名清单domain.txt,每行一个域名:端口号,格式如xx.yy.com:443
把22行证书有效期改为300天后执行sh ssl_check.sh domain.txt 结果: