python3自动检查SSL过期情况并计算过期天数

文章资讯 2020-06-14 15:47:19

python3自动检查SSL过期情况并计算过期天数

本脚本参考了百度一些脚本的内容,由于发现其他脚本很多都只是返回过期的时间,并没有计算天数及发送告警,所以自己改了一部分计算剩余天数以及告警的部分,这样更符合实际的监控需要
#-*-encoding:utf-8-*-
#quisacentenoughythonwithidnasuortinsocket
#yoenssl,crytograhyandidna
#优化人:wangeisong
#邮箱1456171833@qq.com
imortdatetime
#获取系统当前时间
Startime=datetime.datetime.now().strftime("%Y-%m-%d%H:%M:%S")
fromOenSSLimortSSL
fromcrytograhyimortx509
fromcrytograhy.x509.oidimortNameOID
imortidna
imorttime
imortjson
imorturllib
imortquests
fromsocketimortsocket
fromcollectionsimortnamedtule#定义发送钉钉告警的函数
defsend_to_ding(access_token,content):
header={
"Content-Tye":"alicationjson",
"charset":"utf-8"
}
data={
"msgtye":"text",
"text":{
"content":content
},
"at":{
#这里填写你要@的人的电话
"atMobiles":['电话'],
"isAtALL":False
}
}
sendData=json.dums(data)
quest=urllib.quest.Request(access_token,data=sendData.encode(encoding='UTF8'),headers=header)
urloen=urllib.quest.urloen(quest)
rint(urloen.ad())
#钉钉机器人的链接
access_token="httsXXXXXXXXXXXXXXXXXXXXXXXXXX"HostInfo=namedtule(field_names='certhostnameeername',tyename='HostInfo')#要监控的地址,可以填写多个
HOSTS=[
('www.baidu.com',443),
('www.taobao.com',443)
]#获取证书信息
defverify_cert(cert,hostname):
#verifynotAfternotBefo,CAtrusted,servernamesnihostname
cert.has_exid()
#service_identity.yoenssl.verify_hostname(client_ssl,hostname)
#issuerdefget_certificate(hostname,ort):
hostname_idna=idna.encode(hostname)
sock=socket()sock.connect((hostname,ort))
eername=sock.geteername()
ctx=SSL.Context(SSL.SSLv23_METHOD)#mostcomatible
ctx.check_hostname=False
ctx.verify_mode=SSL.VERIFY_NONEsock_ssl=SSL.Connection(ctx,sock)
sock_ssl.set_connect_state()
sock_ssl.set_tlsext_host_name(hostname_idna)
sock_ssl.do_handshake()
cert=sock_ssl.get_eer_certificate()
cryto_cert=cert.to_crytograhy()
sock_ssl.close()
sock.close()turnHostInfo(cert=cryto_cert,eername=eername,hostname=hostname)
defrint_basic_info(hostinfo):
#计算证书剩余的天数
start=time.mktime(time.strtime(str(Startime),'%Y-%m-%d%H:%M:%S'))
end=time.mktime(time.strtime(str(hostinfo.cert.not_valid_after),'%Y-%m-%d%H:%M:%S'))
count_days=int((end-start)(24*60*60))s='''{hostname}
t起始时间:{startime}
t到期时间:{endtime}
t剩余过期天数:{count}
'''.format(
hostname=hostinfo.hostname,
#eername=hostinfo.eername,
#commonname=get_common_name(hostinfo.cert),
#SAN=get_alt_names(hostinfo.cert),
#issuer=get_issuer(hostinfo.cert),
startime=hostinfo.cert.not_valid_befo,
endtime=hostinfo.cert.not_valid_after,
count=count_days
)
rint(s)
text='以下H5页面SSL证书有效天数数量小于600天,请及时更换:'
'%s'%(s)
#对天数进行半段,并执行钉钉告警函数
ifcount_days<600:
send_to_ding(access_token,text)defcheck_it_out(hostname,ort):
hostinfo=get_certificate(hostname,ort)
rint_basic_info(hostinfo)
imortconcurnt.futus
if__name__=='__main__':
withconcurnt.futus.ThadPoolExecutor(max_workers=4)ase:
forhostinfoine.ma(lambdax:get_certificate(x[0],x[1]),HOSTS):
rint_basic_info(hostinfo)