了解文凭的剩余灵验期,不错在文凭行将到期时自动发送警戒奉告。告诉惩处运营东谈主员进行续订或更新,幸免处事中断。
念念要使用Python获得网站的ssl文凭到期技术,咱们不错使用ssl模块和socket库。
提醒
准备将要检测的域名
通过使用ssl模块和socket库获得到对端的文凭信息,并理解文凭中的到期技术。
奉告处理:举例发邮件,发短信等,测试剧本咱们用tabulate打印输出。
# -*- coding: UTF-8 -*-"""获得一个网站HTTPS文凭的到期技术和剩余天数。 pytz: 处理时区治愈 tabulate: 打印漂亮表格"""import socketimport sslfrom datetime import datetimeimport pytzfrom tabulate import tabulatedef get_certificate_info(host='', port=443): """ 获得指定主机HTTPS文凭的信息。 参数: host (str): 主机名或IP地址,默许为 ''。 port (int): 端口,默许为 443。 复返: dict: 包含文凭到期技术和剩余天数的信息字典。 """ try: # 创建默许的SSL高下文 context = ssl.create_default_context # 基于默许高下文和AF_INET地址族创建一个安全的socket一语气 conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=host) # 一语气到指定的主机和端口 conn.connect((host, port)) # 获得对端的文凭信息 cert = conn.getpeercert # 尝试理解文凭的逾期技术 try: not_after = datetime.strptime(cert['notAfter'], "%b %d %H:%M:%S %Y %Z") except Exception as e: # 若是文凭的逾期技术智商无法识别,则复返乖张信息 return { 'expiry_time': "无法识别的日历智商" + e.__str__, 'days_remaining': "未知" } # 创建UTC时区对象 utc_tz = pytz.utc # 将文凭的到期技术开导为UTC技术 not_after_utc = utc_tz.localize(not_after) # 创建北京技术时区对象 beijing_tz = pytz.timezone('Asia/Shanghai') # 将UTC技术治愈为北京技术 not_after_bj = not_after_utc.astimezone(beijing_tz) # 绸缪剩余天数 days_remaining = (not_after_bj - datetime.now(beijing_tz)).days return { 'expiry_time': not_after_bj.strftime('%Y-%m-%d %H:%M:%S'), 'days_remaining': days_remaining } except Exception as e: return { 'expiry_time': str(e), 'days_remaining': "未知" }if __name__ == '__main__': # 界说一个包含多个域名的列表 hostname_list = [ "www.qq.com", "www.baidu.com", "www.sohu.com", "www.xiaomi.com", # 专门给个未知域名 "www.weizhiyuming.com", ] # 启动化一个列表,用于存储主机名过头文凭到期技术的有关信息 hostname_list_result = [ ["检测域名", "到期技术", "剩余天数"] ] # 遍历主机名列表,获得每个主机的文凭信息 for hostname in hostname_list: # 获适当前主机的文凭信息 cert_info = get_certificate_info(hostname) # 构建包含主机名、文凭到期技术、剩余天数的列表 cert_info_result = [ hostname, cert_info['expiry_time'], cert_info['days_remaining'], ] # 将刻下主机的文凭信息列表添加到成果列表中 hostname_list_result.append(cert_info_result) print(tabulate(hostname_list_result, tablefmt="grid", numalign="center"))