shell脚本检查域名证书是否过期
最近公司的域名准备过期了,防止用户访问的时候出现异常,所以最近我们准备替换相关网站证书为最新的。
(一般HTTPS证书有效期为1年,证书过期后或者该证书不是该域名的有效证书时,在浏览器中访问会出现如下提示,这时候如果还是要访问只能通过点击"高级",忽略风险继续访问)

我们这里有些域名是直接解析到自己的业务机器上的,并没有经过运维管理的nginx再来做转发,所以针对这部分域名,就需要的单独到业务机器上下载最新的域名证书,然后替换了一下证书,并重启一下nginx (nginx -s reload) 。
这里替换证书的时候,我遇到了一个坑,就是之前有些域名并不支持https的,然后我就打算换成支持https。结果按照原来的方式配置了https,访问的时候报不安全,提示使用了旧版tsl1.0或tsl1.1的协议,我确保了该域名的协议方式已经修改了,但是浏览器访问的时候,还是提示不安全,网上找了一段时间,才知道要nginx所有的域名配置都修改了,才会生效的,不然nginx 有可能取某个 域名配置的ssl 配置来连接ssl,但是最新的域名下的ssl配置不生效。
按F12打开开发者模式,切到 “Security” tab下页面可以看到不安全的原因,如果是使用了旧版tsl1.0或tsl1.1的协议,则在“Connection”中显示使用了TSL1.0或者TSL1.1的协议。下图的例子是表示无法信任服务器,因为未提供有效的证书。
理论上所有域名都统一由运维部门来管理,直接解析到运维的nginx 再转发到自己的业务机器才是比较好的方案,不然会导致域名不好管理。但是很多历史域名还没时间去修改,就只能手动替换。
这个域名数量会有点多,而且也不知道还有哪些域名还没替换的,因此计划用shell脚本去检查,并且可以将该shell脚本设置为定时任务,每个月或每天定时检查一下,如果有域名要过期了,则告警出来。在网上找了一下相关资料,再根据自己的需求,改造了一版的shell脚本如下:
#!/bin/bash
# 检测https证书有效
echo '开始检查 https证书有效期 '
# 先写域名内容到文件中,再读取文件检查证书是否过期了
# 先清空文件
echo '' > /tmp/https_list.txt
# 这里替换为自己的检查的域名即可
echo 'www.baidu.com' >> /tmp/https_list.txt
echo 'www.bing.com' >> /tmp/https_list.txt
echo 'www.google.com' >> /tmp/https_list.txt
source /etc/profile
# 定义错误的域名
errorDominStr=""
while read line; do
echo "====================================================================================="
echo "当前检测的域名:" $line
end_time=$(echo | timeout 1 openssl s_client -servername $line -connect $line:443 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | awk -F '=' '{print $2}' )
([ $? -ne 0 ] || [[ $end_time == '' ]]) && echo '该域名链接不上,跳到下一个域名' && continue
end_times=`date -d "$end_time" +%s `
current_times=`date -d "$(date -u '+%b %d %T %Y GMT') " +%s `
let left_time=$end_times-$current_times
days=`expr $left_time / 86400`
echo "剩余天数: " $days
[ $days -lt 60 ] && echo "https 证书有效期少于60天,存在风险" && errorDominStr="$errorDominStr \n $line"
done < /tmp/https_list.txt
echo -e "准备过期的域名为: \n $errorDominStr"
if [ "$errorDominStr" = "" ]
then
echo "不包含准备过期的域名"
else
echo "包含准备过期的域名" && exit 10
fi
echo "Good bye!"
exit 0
主要的流程就是读取文件中的域名,然后进行https访问获取到证书过期的时间,如果域名连接不上,则会直接跳过,如果该域名证书过期时间小于 60 天,则汇总起来,最后判断是否包含准备过期的域名,如果包含则异常退出exit 10。
运行后的结果如下:

参考资料:
https://blog.51cto.com/lee90/2410670 shell脚本检测https证书有效期
https://python.01314.cn/201812519.html 使用python检查SSL证书到期情况
shell脚本检查域名证书是否过期的更多相关文章
- Shell脚本检查memcache进程并自己主动重新启动
修正版: #!/bin/sh #check memcache process and restart if down mm_bin="/usr/local/bin/memcached&quo ...
- shell脚本检查是否存在tun0虚拟网卡,若不不存在服务器更改port,并重启服务器,客户端修改port,并重新启动客户端
openvp 客户端 /home 目录下各脚本文件名 [root@jira home]# ls openvpn_server_restart.sh openvpn_tunnel_monitor.sh ...
- shell脚本 检查mysql节点数据一致性
一.简介 源码地址 日期:2018/4/12 介绍:参考pt checksum思想改写,可以定制化的检查随意两个mysql节点的数据一致性. 功能: 检查随意两个几点的数据一致性 支持并发检查,基于库 ...
- shell脚本:通过域名获取证书的过期时间
需要两个文件,一个用于存储域名信息,另一个是检测脚本 注意:这两个文件是在一个目录下 domain_ssl.info [存储域名信息] [root@mini05 ]# cat domain_ssl.i ...
- 【shell脚本】不停地telnet一个ip或域名,并输出结果到文件中===telnetscript.sh
编写shell脚本不停地telnet一个域名,并输出结果到文件中 [root@localhost ~]# cat telnetscript.sh #!/bin/bash #检查是否在root用户下执行 ...
- Shell学习---Shell脚本的静态检查工具shellcheck
Shell脚本的静态检查工具shellcheck ubuntu下 apt install shellcheck ,即可安装shellcheck.写完shell脚本,记得用它检查一下,能给你点建议的.要 ...
- Shell之脚本检查与调试
目录 Shell之脚本检查与调试 参考 脚本语法检查 脚本运行调试 Shell之脚本检查与调试
- web站点检查简易shell脚本
1.web样式 <h4>THE STATUS OF RS:</h4> <meta http-equiv="> <table border=" ...
- 100个Linux Shell脚本经典案例(附PDF)
转载自:https://mp.weixin.qq.com/s/tCKAM67_7K7q2vJthaIsDQ 原文链接:https://wenku.baidu.com/view/4f089430a116 ...
随机推荐
- Amazing!!CSS 也能实现烟雾效果?
最近利用 CSS 实现了一些看似超出 CSS 能力的效果: 巧用渐变实现高级感拉满的背景光动画 Amazing!!CSS 也能实现极光? 本文继续此系列,本文主要想探讨一下,使用 CSS 能否比较好的 ...
- 使用zTree插件实现可拖拽的树
在目前接触到的树插件中,我觉得zTree比较简单,也容易上手.有一次业务需求是将某对象分组树上的对象可以随意拖拽,相当于改变了对象的分组,因此我用到了zTree,对其进行了一些列学习. ...
- 第二十七个知识点:什么是对称密码加密的AEAD安全定义?
第二十七个知识点:什么是对称密码加密的AEAD安全定义? AEAD 在之前的博客里,Luke描述了一种被广泛使用的操作模式(ECB,CBC和CTR)对块密码.我们也可能会想我们加密方案的完整性,完整性 ...
- request参数获取,参数校验,参数处理
需求: 1.post接口,需要在过滤器中进行参数校验,校验通过之后再执行方法 2.原有代码中使用x-www-form-urlencoded传参,新需求要使用json格式 3.原有代码校验过滤器使用Se ...
- Jsonschema2pojo从JSON生成Java类(命令行)
1.说明 jsonschema2pojo工具可以从JSON Schema(或示例JSON文件)生成Java类型, 在文章Jsonschema2pojo从JSON生成Java类(Maven) 已经介绍过 ...
- AES对称加密算法实现:Java,C#,Golang,Python
高级加密标准(Advanced Encryption Standard,简写AES),是一种用来替代DES的对称加密算法,相比DES,AES安全性更高,加密速度更快,因此被广泛使用. 理论上看,AES ...
- 我踩过的Django的坑
把自己在使用Django过程中吃过的亏 踩过的坑 记录一下 1. unique_together传的是元组 正确:unique_together = (('app_id', 'module_id', ...
- sqlplus -S参数表示什么意思?
sqlplus -S , -S选项是静默模式,是Silent的缩写.在这种模式下将会以最精简的形式完成SQL*Plus的交互过程. -S模式多用于脚本模式.在命令行sqlplus -S还有可能出现卡住 ...
- Ant: macrodef
<macrodef name="tokenReplace"> <attribute name="subapp"/> <attrib ...
- springboot启动过程中常用的回调
1.介绍 springboot提供非常丰富回调接口,利用这些接口可以做非常多的事情,对于一些常用的回调接口进行介绍 2.常用的拓展接口 1.ApplicationContextInitializer ...
