写点什么

简单脚本监控 SSL 证书,并到期提醒续签

发布于: 2021 年 02 月 27 日
键盘动图引导关注


​随着 https 的普及,或者说被强制使用,需要维护的 SSL 证书越来越多,而且由于各种原因吧,需要在各种不同的平台申请维护证书,时间长了,总有证书忘记续签


有些使用了 letsencrypt 自动续签,但是某些原因,并不稳定,经常续签失败,letsencrypt 的邮件通知有时候又会被忽略掉


所以写了个简单的证书监控的脚本,结合 zabbix 进行监控,到期提醒续签


#!/usr/bin/env pythonfrom urllib3.contrib import pyopensslfrom datetime import datetimefrom sys import argvimport idnafrom socket import socketimport re
class SSL_Check: def __init__(self, url): self.url = url
@property def get_cert(self): sock = socket() sock.setblocking(True) sock.connect((self.url, 443),) ctx = pyopenssl.OpenSSL.SSL.Context(pyopenssl.OpenSSL.SSL.TLSv1_METHOD) ctx.check_hostname = False ctx.verify_mode = pyopenssl.OpenSSL.SSL.VERIFY_NONE
sock_ssl = pyopenssl.OpenSSL.SSL.Connection(ctx, sock) sock_ssl.set_tlsext_host_name(idna.encode(self.url)) sock_ssl.set_connect_state() sock_ssl.do_handshake() cert = sock_ssl.get_peer_certificate() sock_ssl.close() sock.close() return cert

@property def get_str_time(self): cert = self.get_cert return cert.get_notAfter().decode()[0:-1]

@property def get_ssl_time(self): ssl_time = datetime.strptime(self.get_str_time, '%Y%m%d%H%M%S') return (ssl_time-datetime.now()).days
复制代码


脚本很简单,就三个方法,获取证书、获取证书时间,获取到期天数


网上有人用 load_cerrtificate,结合 ssl.get_server_certificate(url,port)来获取证书,其实这个获取到的证书是不对的,这里获取到的证书是解析完 url,解析到对应服务器,获取服务器上 443 端口访问到的第一个证书,并不是传入 url 的域名的证书


所以这里通过 socket 的方式,建立连接,获取对应域名的证书,再获取证书的信息


脚本放 zabbix_agent 里面,配置 key



在 zabbix_server 用 zabbix_get 验证



在 zabbix 中添加监控项,ssl 监控频率不需要设置太密,按天,或者按周检查都可以



接着添加触发器,检测到 SSL 剩余一个月提醒续签



到期企业微信告警



脚本很简单,不用 zabbix 的话,通过添加定时任务的方式也可以做,如果项目多的话,手动添加不合适,可以通过脚本获取 web 下面的 server_name 作为参数进行监控


关于 pyopenssl 包更多信息可查看文档https://www.pyopenssl.org/en/stable/introduction.html


发布于: 2021 年 02 月 27 日阅读数: 11
用户头像

有一点想法的电脑维修工 2020.07.14 加入

一位有些想法的技术爱好者

评论

发布
暂无评论
简单脚本监控SSL证书,并到期提醒续签