python脚本监听域名证书过期时间,并将通知消息到钉钉
版本一:
执行脚本带上 --dingtalk-webhook和–domains后指定钉钉token和域名
python3 ssl_spirtime.py --dingtalk-webhook https://oapi.dingtalk.com/robot/send?access_token=avd345324 --domains www.abc1.com www.abc2.com www.abc3.com
脚本如下
#!/usr/bin/python3
import ssl
import socket
from datetime import datetime
import argparse
import requestsdef get_ssl_cert_expiration(domain, port=443):context = ssl.create_default_context()conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=domain)conn.connect((domain, port))cert = conn.getpeercert()conn.close()# Extract the expiration date from the certificatenot_after = cert['notAfter']# Convert the date string to a datetime objectexpiration_date = datetime.strptime(not_after, '%b %d %H:%M:%S %Y %Z')return expiration_datedef send_dingtalk_message(webhook_url, message):headers = {'Content-Type': 'application/json'}payload = {"msgtype": "text","text": {"content": message}}response = requests.post(webhook_url, json=payload, headers=headers)if response.status_code == 200:print("Message sent successfully to DingTalk")else:print(f"Failed to send message to DingTalk. HTTP Status Code: {response.status_code}")if __name__ == "__main__":parser = argparse.ArgumentParser(description="Test SSL certificate expiration for multiple domains")parser.add_argument("--dingtalk-webhook", required=True, help="DingTalk webhook URL")parser.add_argument("--domains", nargs='+', required=True, help="List of domains to test SSL certificate expiration")args = parser.parse_args()for domain in args.domains:expiration_date = get_ssl_cert_expiration(domain)current_date = datetime.now()days_remaining = (expiration_date - current_date).daysprint(f"SSL certificate for {domain} expires on {expiration_date}")print(f"Days remaining: {days_remaining} days")if days_remaining < 300:message = f"SSL certificate for {domain} will expire on {expiration_date}. Only {days_remaining} days remaining."send_dingtalk_message(args.dingtalk_webhook, message)
版本二
执行脚本带上 --dingtalk-webhook、–secret和–domains后指定钉钉token、密钥和域名
python3 ssl_spirtime4.py --dingtalk-webhook https://oapi.dingtalk.com/robot/send?access_token=abdcsardaef--secret SEC75bcc2abdfd --domains www.abc1.com www.abc2.com www.abc3.com
#!/usr/bin/python3
import ssl
import socket
from datetime import datetime
import argparse
import requests
import hashlib
import hmac
import base64
import timedef get_ssl_cert_expiration(domain, port=443):context = ssl.create_default_context()conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=domain)conn.connect((domain, port))cert = conn.getpeercert()conn.close()# Extract the expiration date from the certificatenot_after = cert['notAfter']# Convert the date string to a datetime objectexpiration_date = datetime.strptime(not_after, '%b %d %H:%M:%S %Y %Z')return expiration_datedef send_dingtalk_message(webhook_url, secret, message):headers = {'Content-Type': 'application/json'}# Get the current timestamp in millisecondstimestamp = str(int(round(time.time() * 1000)))# Combine timestamp and secret to create a sign stringsign_string = f"{timestamp}\n{secret}"# Calculate the HMAC-SHA256 signaturesign = base64.b64encode(hmac.new(secret.encode(), sign_string.encode(), hashlib.sha256).digest()).decode()# Create the payload with the calculated signaturepayload = {"msgtype": "text","text": {"content": message},"timestamp": timestamp,"sign": sign}response = requests.post(f"{webhook_url}×tamp={timestamp}&sign={sign}", json=payload, headers=headers)if response.status_code == 200:print("Message sent successfully to DingTalk")else:print(f"Failed to send message to DingTalk. HTTP Status Code: {response.status_code}")if __name__ == "__main__":parser = argparse.ArgumentParser(description="Test SSL certificate expiration for multiple domains")parser.add_argument("--dingtalk-webhook", required=True, help="DingTalk webhook URL")parser.add_argument("--secret", required=True, help="DingTalk robot secret")parser.add_argument("--domains", nargs='+', required=True, help="List of domains to test SSL certificate expiration")args = parser.parse_args()for domain in args.domains:expiration_date = get_ssl_cert_expiration(domain)current_date = datetime.now()days_remaining = (expiration_date - current_date).daysprint(f"SSL certificate for {domain} expires on {expiration_date}")print(f"Days remaining: {days_remaining} days")if days_remaining < 10:message = f"SSL certificate for {domain} will expire on {expiration_date}. Only {days_remaining} days remaining."send_dingtalk_message(args.dingtalk_webhook, args.secret, message)
终极版本
python执行脚本时指定配置文件

python3 ssl_spirtime.py --config-file config.json
config.json配置文件内容如下
{"dingtalk-webhook": "https://oapi.dingtalk.com/robot/send?access_token=avbdcse345dd","secret": "SECaegdDEdaDSEGFdadd12334","domains": ["www.a.tel","www.b.com","www.c.app","www.d-cn.com","www.e.com","www.f.com","www.g.com","www.gg.com","www.sd.com","www.234.com","www.456.com","www.addf.com","www.advdwd.com","aqjs.aefdsdf.com","apap.adedgdg.com","cbap.asfew.com","ksjsw.adfewfd.cn","wdxl.aeffadaf.com","wspr.afefd.shop","sktprd.daeafsdf.shop","webskt.afaefafa.shop","www.afaead.cn","www.afewfsegs.co","www.aaeafsf.com","bdvt.aeraf.info","dl.afawef.co","dl.aefarge.com"]
}
脚本内容如下
#!/usr/bin/python3
import ssl
import socket
from datetime import datetime
import argparse
import requests
import hashlib
import hmac
import base64
import time
import jsondef get_ssl_cert_expiration(domain, port=443):context = ssl.create_default_context()conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=domain)conn.connect((domain, port))cert = conn.getpeercert()conn.close()# Extract the expiration date from the certificatenot_after = cert['notAfter']# Convert the date string to a datetime objectexpiration_date = datetime.strptime(not_after, '%b %d %H:%M:%S %Y %Z')return expiration_datedef send_dingtalk_message(webhook_url, secret, message):headers = {'Content-Type': 'application/json'}# Get the current timestamp in millisecondstimestamp = str(int(round(time.time() * 1000)))# Combine timestamp and secret to create a sign stringsign_string = f"{timestamp}\n{secret}"# Calculate the HMAC-SHA256 signaturesign = base64.b64encode(hmac.new(secret.encode(), sign_string.encode(), hashlib.sha256).digest()).decode()# Create the payload with the calculated signaturepayload = {"msgtype": "text","text": {"content": message},"timestamp": timestamp,"sign": sign}response = requests.post(f"{webhook_url}×tamp={timestamp}&sign={sign}", json=payload, headers=headers)if response.status_code == 200:print("Message sent successfully to DingTalk")else:print(f"Failed to send message to DingTalk. HTTP Status Code: {response.status_code}")if __name__ == "__main__":# 从配置文件中加载配置with open("config.json", 'r') as config_file:config = json.load(config_file)dingtalk_webhook = config.get("dingtalk-webhook")secret = config.get("secret")domains = config.get("domains")for domain in domains:expiration_date = get_ssl_cert_expiration(domain)current_date = datetime.now()days_remaining = (expiration_date - current_date).daysprint(f"SSL certificate for {domain} expires on {expiration_date}")print(f"Days remaining: {days_remaining} days")if days_remaining < 10:message = f"SSL certificate for {domain} will expire on {expiration_date}. Only {days_remaining} days remaining."send_dingtalk_message(dingtalk_webhook, secret, message)
执行结果
/usr/bin/python3 /root/ssl_spirtime.py --config-file /root/config.json
SSL certificate for www.a.tel expires on 2024-06-08 23:59:59
Days remaining: 220 days
SSL certificate for www.b.com expires on 2024-05-23 07:45:13
Days remaining: 203 days
SSL certificate for www.c.app expires on 2024-05-23 07:45:13
Days remaining: 203 days
SSL certificate for www.d-cn.com expires on 2024-03-03 00:00:00
Days remaining: 122 days
SSL certificate for www.aed.com expires on 2024-11-17 06:30:15
Days remaining: 381 days
SSL certificate for www.afedf.com expires on 2024-06-20 23:59:59
Days remaining: 232 days
SSL certificate for www.aefdfd.com expires on 2024-06-20 23:59:59
钉钉告警消息如下

相关文章:
python脚本监听域名证书过期时间,并将通知消息到钉钉
版本一: 执行脚本带上 --dingtalk-webhook和–domains后指定钉钉token和域名 python3 ssl_spirtime.py --dingtalk-webhook https://oapi.dingtalk.com/robot/send?access_tokenavd345324 --domains www.abc1.com www.abc2.com www.abc3.com脚本如下 #!/usr/bin…...
那些看起来高大上的封装函数
什么 ToGray 只支持3通道图像, 让我看看怎么个事 就这么生硬的加了个判断 好家伙 调用了下opencv ,通道数都不判断一下...
go语言 | grpc原理介绍(三)
了解 gRPC 通信模式中的消息流 gRPC 支持四种通信模式,分别是简单 RPC、服务端流式 RPC、客户端流式 RPC 和双向流式 RPC。 简单 RPC 在gRPC中,一个简单的RPC调用遵循请求-响应模型,通常涉及以下几个关键步骤和组件: 请求头&a…...
记一次heapdump泄漏获取服务器权限
文章目录 一、漏洞原因二、漏洞利用三、漏洞进一步利用1、工具下载2、通过关键字查询3、通过配置redis的默认账号和密码进行登录4、添加定时计划任务,进行反弹shell5、成功获取服务器的shell补充四、总结五、免责声明一、漏洞原因 扫描目录发现某个spring框架存在大量泄露信息…...
大疆Livox MID-360安装ROS1/2驱动 Ubuntu20.04
文章目录 一、接线连接二、安装上位机可视化工具三、安装ROS驱动3.1 配置静态IP3.2 安装Livox SDK23.3 安装ROS驱动3.4 驱动 本文介绍如何在Ubuntu20.04中安装大疆Livox MID-360的ROS1/2驱动 一、接线连接 livox航插一分三线,其中航空母头连接激光雷达,…...
Android 重启App
要重启 Android 应用程序,可以使用 PendingIntent 和 AlarmManager 来实现。下面是一种实现方式: fun restartApp(context: Context) {val packageManager context.packageManagerval intent packageManager.getLaunchIntentForPackage(context.packa…...
C语言的前置知识:数据量单位、汇编语言和寄存器
数据量单位 位(bit)是计算机中最小的存储单位,每一位可以存储一个二进制码值的0或1。而字节(byte)则通常是由八个位组成的一个存储单元。在计算机中,字节是最小的可寻址单位,这意味着 CPU 在使…...
【IDEA】在工具栏设置快速创建包和类的图表
页面效果: 操作步骤: 设置 --> 外观与行为 --> 菜单与工具栏 --> 点击 主工具栏 --> 点击 ---- --> 点击 号 --> 添加操作 主菜单 --> 文件 --> 文件打开操作 --> 打开项目操作 --> 新建 --> 往下找 找到 clas…...
int arrayL = sizeof(array) / sizeof(array[0]);
我有一个四个元素的doublearray,这里我会得到4还是5? 在C或C中,使用 sizeof(array) / sizeof(array[0]) 来计算数组的长度是一种常见的方法。但是,这种方法只适用于在同一作用域中声明的数组,而不适用于函数参数传递的…...
FFmpeg——使用Canvas录制视频尚存问题的解决方案
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
css进阶知识点速览
0前言 零基础部分的博客 1选择器进阶 1.1后代选择器 作用:根据html标签的嵌套关系,选择父元素后代中满足条件的元素 选择器语法:选择器1 选择器2 {css} 结果: 在选择器1所找到标签的后代中 注意: 后代包括…...
P2047 [NOI2007] 社交网络
Portal. 观察到数据范围 n ≤ 100 n\leq 100 n≤100,考虑用 Floyd。 在 Floyd 更新最短路的过程中,如果以当前结点为中转点的路径更新过,那么可以累加答案;否则,更新最短路径并重置答案。 统计答案时,枚…...
线性表的顺序存储
1.创建:实质是对data与length的修改 //定义一个线性表 typedef struct {int data[MaxSize];//存储线性表的元素 int length;//线性表的长度 }SqList; //新建一个表 void create(SqList &l){//传入地址才可以对其值进行改变 printf("请输入线性表的长度&…...
ChinaSoft 论坛巡礼 | 安全攸关软件的智能化开发方法论坛
2023年CCF中国软件大会(CCF ChinaSoft 2023)由CCF主办,CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办,将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…...
采用XML作为GUI描述语言
设计方案采用XML作为GUI描述语言的机制主要包括以下几个方面: 模型定义:使用XML定义GUI组件的模型,包括组件的名称、类型、属性、事件等。布局管理:使用XML定义GUI组件的布局,包括组件之间的相对位置、大小、对齐方式等。数据绑定:使用XML定义GUI组件的数据绑定方式,包括数据来…...
rust入门基础案例:猜数字游戏
案例出处是《Rust权威指南》,书中有更加详细的解释。从这个例子中,我们可以了解到 rust 的两个操作: 如何从控制台读取用户输入rust 如何生成随机数 代码格式化 编译器可在保存时对代码做格式化处理,底层调用 rustfmt 来实现&a…...
vue-cli5.0.x优雅降级,配置项目兼容旧版浏览器
兼容低版本谷歌浏览器 vue-cli5.0.x脚手架下的,如何降低项目版本以适用于底版本的浏览器。 直接使用默认配置打包部署出来的项目再40,60、70版本的谷歌浏览器跑不起来,蓝屏或者浏览器白屏一般这种情况都需要通过Babel去做转换,我…...
关于RabbitMQ的小总结
问题:消息在转换机无法被路由 发布确认高级作用在生产者发送到转换机,回退消息作用在消息在转换机无法被路由的情况(消息无法路由的意思是,消息在转换机没有匹配到对应的队列),进行消息回退,打…...
webgoat靶场攻关
A(5) Broken Access Control Insecure Direct Object References 直接对象引用 直接对象引用是指应用程序使用客户端提供的输入来访问数据和对象。 例子 使用 GET 方法的直接对象引用示例可能如下所示 https://some.company.tld/dor?id12345 https…...
BEV-YOLO 论文学习
1. 解决了什么问题? 出于安全和导航的目的,自驾感知系统需要全面而迅速地理解周围的环境。目前主流的研究方向有两个:第一种传感器融合方案整合激光雷达、相机和毫米波雷达,和第二种纯视觉方案。传感器融合方案的感知表现鲁棒&am…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
