shell脚本:通过域名获取证书的过期时间

各位读者都是经常上网的人,当今社会我们可以暂时性没有很多东西,但是就是不能没有网络。否则的话可能会产生严重的焦虑,感觉自己突然就和社会脱节了。

那么在访问各网站的时候,不知道你有没有注意几乎所有网站网址的开头都是 https:// 打头的,而不是 http:// 打头。为什么呢?因为 https 协议对比 http 协议而言安全性更有保证。防止你访问过程中产生的敏感信息被第三方人或组织非法获取到,并作他用。

自签发证书和权威证书

当然如果一个网站需要提供 https 访问,那么需要 SSL 证书,这个证书有两种途经获取:第一,我们自签发;第二,购买权威证书。

这两个有什么区别呢?前者不被浏览器承认,因为这个证书是自签发的,认为是非法的。谁知道你有没有动过什么手脚呢,对吧。

自签发证书,谷歌浏览器访问结果如下:
image

如果我们使用权威证书呢,那么需要我们申请域名,然后备案「就是用来做什么的,如果用途不当,也好查你。」,之后就是向 SSL 权威机构购买 SSL 权威证书了。购买完后,就能在你的网站上使用了。

权威证书,谷歌浏览器访问结果如下:
image

是不是想着这样就万事大吉了,以后这个 SSL 证书就能够一直使用下去了。呵呵……,少年你太单纯了,要是这样怎么符合细水长流的做法,权威机构是不会只做一锤子买卖的,那样岂不亏大了。这个 SSL 证书是有过期时间的,如果过期你还未更新,仍使用老的 SSL 证书,那么浏览器就会提示不安全。那样你的用户还敢访问你的网站吗,哼哼…………。

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

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

所谓监控好加,但是如何获取 SSL 证书的过期时间呢,这才是重点。那么就到了我们今天的正文了。「哎,扯了半天终于到正主了,让各位读者久等了。」

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

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

domain_ssl.info「存储域名信息」

1
2
3
[root@mini05 20180930]# cat domain_ssl.info 
# 检测百度域名
www.baidu.com:443

check_domain_time.sh「SSL 证书过期检测脚本」

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@mini05 20180930]# cat check_domain_time.sh 
#!/bin/bash
################ Version Info ##################
# Create Date: 2018-09-29
# Author: Zhang
# Mail: zhang@xxxx.com
# Version: 1.0
# Attention: 通过域名获取证书的过期时间
################################################
# V1.0.0 2018-09-29 脚本编写 张
# 1.通过域名获取证书的过期时间
################################################

# 加载环境变量
. /etc/profile
. ~/.bash_profile
. /etc/bashrc

# 脚本所在目录即脚本名称
script_dir=$( cd "$( dirname "$0" )" && pwd )
script_name=$(basename ${0})

readFile="${script_dir}/domain_ssl.info"
grep -v '^#' ${readFile} | while read line;do # 读取存储了需要监测的域名的文件
# echo "${line}"
get_domain=$(echo "${line}" | awk -F ':' '{print $1}')
get_port=$(echo "${line}" | awk -F ':' '{print $2}')

# echo ${get_domain}
# echo "${get_port}"
# echo "======"

# 使用openssl获取域名的证书情况,然后获取其中的到期时间
END_TIME=$(echo | openssl s_client -servername ${get_domain} -connect ${get_domain}:${get_port} 2>/dev/null | openssl x509 -noout -dates |grep 'After'| awk -F '=' '{print $2}'| awk -F ' +' '{print $1,$2,$4 }' )

END_TIME1=$(date +%s -d "$END_TIME") # 将日期转化为时间戳
NOW_TIME=$(date +%s -d "$(date | awk -F ' +' '{print $2,$3,$6}')") # 将当前的日期也转化为时间戳

RST=$(($(($END_TIME1-$NOW_TIME))/(60*60*24))) # 到期时间减去目前时间再转化为天数

echo "${RST}"
done

执行结果

1
2
[root@mini05 20180930]# sh check_domain_time.sh 
389

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

<-------------the end------------->
lightzhang wechat
欢迎扫一扫,订阅我的微信公众号!
坚持原创分享,你的支持就是我最大的动力!