ssl证书过期监控
一、需求引入
之前试过有个网站证书悄悄过期了,上一年不是过年过的特别早么,那个春节关服务的定时脚本竟然忘记关了!!!(幸好领导没有看到,除非往上翻监控信息,不然上班那会一般只会看到最新的数据库备份监控信息)
这玩意实际上是nginx加载了停服务的虚拟配置文件,我就虚构了一个假的端口,proxy_pass 转过去。至于原端口nginx代理某个静态网目录是没有停的。当时吓坏了,把人家网站关了那么久耶(0点关到7点)。然后一早起来,我手动开起来了。但发现页面说是不安全的,除非点击继续访问(算了知道是证书过期,回公司再弄)。这关停的时间内竟然没有人发现,没有人投诉,不过有些事情不怕一万,只怕万一,如果是一个非常重要的网站,经常有人看的,证书过期了,作为运维的你竟然没发现,呵呵,你就等着写故障报告吧~~~是不是细思极恐,所以嘛,做运维就应该要有点前瞻性,不要等事情发生才懂得预防,毕竟,防患于未然会省去后续很多活的
二、需求实现
有两个脚本都是用openssl去搞的(当然我是抄的,一个抄网上,一个抄前运维的,就改了点就能用了)
1、check_ssl.sh ——》运行需要接参数,用来做单一域名测试不错
1 #!/bin/bash
2
3 # 检测https证书有效期
4 if [ $# -ne 1 ]; then
5 echo "请输入需要的检查域名: 例如 /check_ssl.sh www.baidu.com"
6 else
7 #参数设置为host
8 host=
9 #最后到期时间
10 #end_date=`echo |openssl s_client -servername $host -connet $host:443 2nssl x509 -noout -dates|awk -F '=' '/notAfter/{print }'`
11 #最后到期时间转换为时间戳
12 end_data=`date +%s -d "$(echo |openssl s_client -servername $host -connect $host:443 2>/dev/null | openssl x509 -noout -dates|awk -F '=' '/notAfter/{print }')"`
13 #当前时间戳
14 new_date=$(date +%s)
15 #计算SSL证书截止到现在的过期天数
16 #计算SSL正式到期时间和当前时间的差值
17 days=$(expr $(expr $end_data - $new_date) / 86400)
18 echo -e "3[31m 您的$host 证书 还有${days}天到期 请谨慎处理 3[0m"
19 fi
运行脚本: ./check_ssl.sh 检测域名
结果显示是这样的:
2、domain_ssl_new.sh ——》这脚本放到计划任务了
前运维写的,我就直接用了,为了尊重版权,加个后缀叫"new"。
要引入一个domain_ssl_new.txt ,填入你要检测的域名即可(注意:一行一个域名)
1 #!/bin/bash
2
3 #监控域名证书到期发送钉钉消息通知
4 #作者:ljy
5 #日期:2021/01/27
6 #版本:v1.0
7
8 PHONE="159xxxx0136"
9 TOKEN="https://oapi.dingtalk.com/robot/send?access_token=xxx"
10
11 dir="/home/用户/scripts/domain"
12 for yuming in `cat ${dir}/domain_ssl_new.txt` #读取存储了需要监控的域名文件
13 do
14 END_TIME=$(echo | openssl s_client -servername $yuming -connect $yuming:443 2>/dev/null | openssl x509 -noout -dates |grep 'After'| awk -F '=' '{print }'| awk -F ' +' '{print ,, }')
15
16 #使用openssl获取域名的证书情况,然后获取其中的到期时间
17 END_TIME1=$(date +%s -d "$END_TIME") #将日期转化为时间戳
18 NOW_TIME=$(date +%s -d "$(date | awk -F ' +' '{print ,,}')") #将目前的日期也转化为时间戳
19
20 NEW_TIME=$(($(($END_TIME1-$NOW_TIME))/(60*60*24))) #到期时间减去目前时间再转化为天数
21
22 if [ $NEW_TIME -lt 10 ]; #当到期时间小于10天时,发钉钉群告警
23 then
24 curl -H "Content-Type:application/json" -X POST --data '{"msgtype":"text","text":{"content":"域名:'$yuming' ssl免费证书到期日期,剩余:'$NEW_TIME' 天"} , "at": {"atMobiles": ['${PHONE}'], "isAtAll": false}}' ${TOKEN} > /dev/null 2>&1
25 fi
26 done
3、用工具搞:LetsMonitor ——》貌似要FQ才能打开
提供免费ssl检测服务,在凭证需要需用或过期前发送提醒(仅限邮件发送,而且只能添加5个域名证书监控,不然要收费)
## 使用说明,我简单说下
1、注册之后,在Contacts上添加要发送的邮箱
2、然后打开“Monitors”,设置要监控的域名证书
3、做了个模拟证书过期的小测试,如下设置,然后运行“Run Test”,测试是否能成功发送提醒
测试证书实际过期时间为158天,我这里设置了还剩下160天报警。
(1)
(2)
(3)运行“Run Test”
(4)最后QQ邮箱就收到过期提示了
(据说只发一次,所以微信最好开一下QQ邮件提醒,相当于发到微信了)。这工具作为备用提醒还是可以滴,反正也是白嫖,哈哈哈哈~~~~