python脚本检查ssl证书到期并邮件告警

454 阅读1分钟
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time    : 2021/3/11 10:38
# @Author  : XuLiLiang
# @Email   : xuliliang@epailive.com
# @File    : checkssl.py


import datetime,time
from email.header import Header
import requests,threading
import ssl, socket
import smtplib
from email.mime.text import MIMEText
from apscheduler.schedulers.blocking import BlockingScheduler

def checkcert(domain):
    info=""
    c = ssl.create_default_context()
    s = c.wrap_socket(socket.socket(), server_hostname=domain)
    s.connect((domain, 443))
    cert = s.getpeercert()
    nowTime = time.time()
    expireTime = cert['notAfter']
    index = domain.index('.')
    yuming=domain[index + 1:]
    # 转换为时间戳
    GMT_FORMAT = '%b %d %H:%M:%S %Y GMT'
    forTime = datetime.datetime.strptime(expireTime, GMT_FORMAT) + datetime.timedelta(hours=8)
    expireTime = time.mktime(forTime.timetuple())
    # 比较时间
    if expireTime > nowTime:
        # 大于说明没到期,获取时间差
        lastTime = expireTime - nowTime
    else:
        info = f"{domain}域名 证书已经过期,请更换!"
    # 转换时间戳为天
    lastTime = int(lastTime) / 60 / 60 / 24
    if lastTime > 90:
        info = f"域名{yuming}距离过期时间还有{int(lastTime)}天过期,到期时间{forTime}"
    elif lastTime < 90:
        info = f"域名{yuming}距离过期时间还有{int(lastTime)}天过期,到期时间{forTime}"
    elif lastTime <60:
        info = f"域名{yuming}距离过期时间还有{int(lastTime)}天过期,到期时间{forTime}"
    elif lastTime <30:
        info = f"域名{yuming}距离过期时间还有{int(lastTime)}天过期,到期时间{forTime},请抓紧申请证书"
        # sendMsg()
    sendMail("saas证书到期检查",info)
def sendMail(subject, info):
    mail_host = "xxxx"
    mail_user = "xxxxx"
    mail_pass = "xxxxx"

    sender = 'xxxxx'
    receivers = ['xxxxxx',]
    mail_result = str(info)
    msg = MIMEText(mail_result, 'plain', 'utf-8')
    msg['From'] = Header("证书到期检查", 'utf-8')
    msg['To'] = Header("yunlist", 'utf-8')
    msg['Subject'] = "%s" % (subject)
    try:
        smtpObj = smtplib.SMTP()
        smtpObj.connect(mail_host, 25)
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, receivers, msg.as_string())
        print
        "邮件发送成功"
    except smtplib.SMTPException:
        print
        "Error: 无法发送邮件"

scheduler = BlockingScheduler()

# https://www.cnblogs.com/zhaoyingjie/p/9664081.html
@scheduler.scheduled_job('cron',minute ='*/2')
def main():
    print("当前时间:",time.strftime("%Y-%M-%d %H:%M:%S",time.localtime()))
    domain_list=["abc.com","aa.com"] #域名列表,必须是https的域名
    for i in range(len(domain_list)):
        try:
            t=threading.Thread(target=checkcert,args=(domain_list[i],))
            t.start()
            t.join()
        except:
            print("Error: 无法启动线程")
scheduler.start()
if __name__ == "__main__":
    main()