【Shell】利用Shell脚本检测域名证书过期时间


各位读者都是经常上网的人,当今社会我们可以暂时性没有很多东西,但是就是不能没有网络。否则的话可能会产生严重的焦虑,感觉自己突然就和社会脱节了。那么在访问各网站的时候,不知道你有没有注意几乎所有网站网址的开头都是 https:// 打头的,而不是 http:// 打头。为什么呢?因为 https 协议对比 http 协议而言安全性更有保证。防止你访问过程中产生的敏感信息被第三方人或组织非法获取到,并作他用。

实际中不管是个人,还是部门,还是一个公司,总不能每天都看看自家网站的 SSL 证书什么时候过期吧。即便每天看,只要是人执行那总有打盹的时候,那就会有疏漏,要是发生证书过期并且未及时更新新证书产生了其他影响,这事儿就难说了。

因此为了避免上述现象,我们应该怎么防范呢。答案:对 SSL 证书过期时间加监控,比如过期时间小于 30 天就告警,这样我们就能从容处理了。大多数公司都有告警系统吧,例如:zabbix 或者 cacti 或者 open-falcon 等。

但是如何获取域名绑定的证书的过期时间呢?

通过域名获取 SSL 证书过期时间

需要两个文件,一个用于存储域名和端口信息,另一个是具体检测 SSL 证书过期时间的执行脚本。注意:这两个文件是在一个目录下。

domain_list 存储域名信息

[qianfeng@nginx-test ~]$ cat domain_list
www.baidu.com

check_sh.sh 检测域名脚本

[qianfeng@nginx-test ~]$ cat check_sh.sh
#!/bin/bash
declare -A result_dict
for domain in `cat domain_list`
do
        END_TIME=`echo | timeout 5 openssl s_client -servername $domain -connect $domain:443 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | awk -F '=' '{print $2}' `
        if [ $? -eq 0 ] && [[ ${END_TIME} != '' ]];then
                END_TIME_UNIX=$(date +%s -d "$END_TIME")
                NOW_TIME_UNIX=$(date +%s -d "$(date | awk -F ' +'  '{print $2,$3,$6}')")
                RST=$[$[$END_TIME_UNIX-$NOW_TIME_UNIX]/(60*60*24)]
                if [[ ${RST} -lt 60 ]];then
                        result_dict["${domain}"]=${RST}
                fi
        fi
done
for key in `echo ${!result_dict[*]}`
do
        echo  -n "${key}:${result_dict[${key}]} "
done

执行结果

[qianfeng@nginx-test ~]$ bash check_sh.sh
www.baidu.com:221

有了上面这个结果后,相信你就知道应该怎么对其进行监控了。

升级优化成多线程,加快执行速度!

#!/bin/bash
Domain_check() {
        END_TIME=`echo | timeout 1 openssl s_client -servername $2 -connect $2:443 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | awk -F '=' '{print $2}'`
        if [ $? -eq 0 ] && [[ ${END_TIME} != '' ]];then
                END_TIME_UNIX=$(date +%s -d "$END_TIME")
                NOW_TIME_UNIX=$(date +%s -d "$(date | awk -F ' +'  '{print $2,$3,$6}')")
                RST=$[$[$END_TIME_UNIX-$NOW_TIME_UNIX]/(60*60*24)]
                #echo "$RST"
                if [[ ${RST} -lt $1 ]];then
                        echo -n "$2:$RST " >> result.txt
                fi
        fi
}
for domain in `cat domain_list2`
do
        Domain_check $1 $domain &
done
sleep 2s
cat result.txt | tr -d "\n"
echo > result.txt