编写Python脚本在证书过期10天内将域名信息发送到钉钉

news2024/11/10 7:36:16

1、配置文件config.json

{
    "dingtalk-webhook": "https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXXXXXXX",
    "secret": "XXXXXXXXXXXXXXXXXXXXXX",
    "domains": [
        "www.advd.tel",
        "dre.dfefer.cn:8443"
    ]
}

2、Python脚本正文

#!/usr/bin/python3
import ssl
import socket
from datetime import datetime
import requests
import hashlib
import hmac
import base64
import time
import json

def get_ssl_cert_expiration(domain, port=443):
    try:
        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 certificate
        not_after = cert['notAfter']

        # Convert the date string to a datetime object
        expiration_date = datetime.strptime(not_after, '%b %d %H:%M:%S %Y %Z')

        return expiration_date
    except Exception as e:
        raise RuntimeError(f"Error retrieving SSL certificate for {domain} on port {port}: {str(e)}")

def send_dingtalk_message(webhook_url, secret, message):
    headers = {'Content-Type': 'application/json'}

    # Get the current timestamp in milliseconds
    timestamp = str(int(round(time.time() * 1000)))

    # Combine timestamp and secret to create a sign string
    sign_string = f"{timestamp}\n{secret}"
    
    # Calculate the HMAC-SHA256 signature
    sign = base64.b64encode(hmac.new(secret.encode(), sign_string.encode(), hashlib.sha256).digest()).decode()

    # Create the payload with the calculated signature
    payload = {
        "msgtype": "text",
        "text": {
            "content": message
        },
        "timestamp": timestamp,
        "sign": sign
    }
    
    response = requests.post(f"{webhook_url}&timestamp={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}")

def parse_domain_and_port(domain_with_port):
    if ':' in domain_with_port:
        domain, port = domain_with_port.split(':')
        return domain, int(port)
    else:
        return domain_with_port, 443  # 默认使用443端口

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_with_port in domains:
        domain, port = parse_domain_and_port(domain_with_port)

        try:
            expiration_date = get_ssl_cert_expiration(domain, port)
            current_date = datetime.now()
            days_remaining = (expiration_date - current_date).days

            print(f"SSL certificate for {domain} (port {port}) expires on {expiration_date}")
            print(f"Days remaining: {days_remaining} days")

            if days_remaining < 10:
                message = f"SSL certificate for {domain} (port {port}) will expire on {expiration_date}. Only {days_remaining} days remaining."
                send_dingtalk_message(dingtalk_webhook, secret, message)
        except Exception as e:
            error_message = f"Failed to retrieve SSL certificate for {domain} (port {port}). Error: {str(e)}"
            print(error_message)
            send_dingtalk_message(dingtalk_webhook, secret, error_message)

3、执行命令

/usr/bin/python3 /root/ssl/ssl_spirtime_check.py --config-file /root/ssl/config.json

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux运维篇-tigervnc工具的使用

目录 简介下载使用clientserver配置文件服务管理 设定密码&#xff08;先切换成对应的用户&#xff09;&#xff1a;配置多用户的VNC tigervnc连接排错一、vnc密码错误二、vncserver端口忘记了三、连接很卡&#xff0c;或者画面没有反应四、服务报错 简介 TigerVNC是VNC的一种…

Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)

题目&#xff1a;*18.29(某个目录下的文件数目) 编写一个程序&#xff0c;提示用户输入一个目录&#xff0c;然后显示该目录下的文件数。 和上一题(18.28)的思路差不多&#xff0c;把找到文件后累加大小到变量变成计数1即可。 Java语言程序设计基础篇_编程练习题*18.28 (非递…

光莆亮相第25届中国国际光博会(CIOE2024)

“光引未来&#xff0c;驱动创新” 2024年9月11-13日&#xff0c;第25届中国国际光电博览会(CIOE2024)在深圳国际会展中心(宝安新馆)隆重开幕。作为国家商务部首批重点展览会&#xff0c;CIOE2024聚焦科研成果转化&#xff0c;推动产学研用深度融合&#xff0c;光电行业全产业…

【海康威视面经】

海康威视面经 Java基础java常用集合 及其优缺点ArrayListVectorLinkedList Jvm调优监控发现问题工具分析问题 &#xff1a;性能调优GC频繁 出现内存泄漏 内存溢出CPU飙升 Synchronized和Volatile的比较反射线程池和new thread利弊高并发 集群 分布式 负载均衡 MySQL调优基础优化…

探索Python中文拼音转换的奥秘:xpinyin库

文章目录 **探索Python中文拼音转换的奥秘&#xff1a;xpinyin库**背景介绍库简介安装指南函数使用示例应用场景常见问题与解决方案总结 探索Python中文拼音转换的奥秘&#xff1a;xpinyin库 背景介绍 在处理中文文本数据时&#xff0c;我们经常需要将中文字符转换为拼音。无…

TS Vue项目中使用TypeScript

模块系统与命名空间 概念 模块化开发是目前最流行的组织代码方式&#xff0c;可以有效的解决代码之间的冲突与代码之间的依赖关系&#xff0c;模块系统一般视为“外部模块”&#xff0c;而命名空间一般视为“内部模块” 模块系统 TS中的模块化开发跟ES6中的模块化开发并没有…

22 C 语言字符处理:分类判断与转换(ASCII 码、字母大小写)函数详解

目录 1 isdigit() 1.1 函数原型 1.2 功能说明 1.3 代码示例 2 isxdigit() 2.1 函数原型 2.2 功能说明 2.3 代码示例 3 islower() 3.1 函数原型 3.2 功能说明 3.3 代码示例 4 isupper() 4.1 函数原型 4.2 功能说明 4.3 代码示例 5 isalnum() 5.1 函数原型 5.…

MySQL索引知识个人笔记总结

本篇笔记是个人整理的索引知识总结&#xff0c;刚开始有点乱&#xff0c;后续会一直边学边整理边总结 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。就好比索引就是数据的目录 索引结构 Btree索引,Hash索引,Full-text索引&#xff0c;R-tree(空…

L67 【哈工大_操作系统】操作系统历史 学习任务

L6 操作系统历史 线条一 1、上古神机 IBM7094 专注于计算批处理操作系统&#xff08;Batch system&#xff09; 2、OS/360 一台计算机干多种事&#xff0c;多道程序作业之间的 切换和调度 成为核心 &#xff08;多进程结构和进程管理概念萌芽&#xff01;&#xff09; 3…

关于Java数据结构中集合的一个小知识

在我们以后刷题的过程&#xff0c;我们会遇到一些奇怪的集合数据类型。 如下图 这里&#xff0c;我们以顺序表的集合类为例&#xff0c;我们看到上图函数的返回值类型有点奇怪&#xff0c;其实并不奇怪&#xff0c;也就是穿过去的参数类型是一个顺序表的集合类型&#xff0c;也…

Mysql高级篇(中)—— SQL优化

SQL优化 一、SQL优化的计划或思路二、关联查询优化三、子查询优化四、exists 和 not exists1、exists 介绍2、exists 和 not exists 五、单路排序和多路排序&#xff08;了解&#xff09;六、排序分组优化1、order by&#xff08;1&#xff09;避免临时排序,使用索引排序&#…

【LabVIEW】条件结构的使用

本篇文章记录LabVIEW条件结构的使用方法&#xff0c;希望我的分享能对你有所帮助&#xff01; 一、实践项目 二、工程详解 1、考虑到输入的数值需要判断一下是否是在0-100之间&#xff0c;故使用“判定范围并强制转换”模块 2、设置数值表示法和上下限 3、验证判断 4、最终程…

(黑马点评)二、短信登录功能实现

2.1 基于传统Session实现的短信登录及其校验 2.1.1 基于Session登录校验的流程设计 2.1.2 实现短信验证码发送功能 请求接口/user/code请求类型post请求参数phone返回值无 /*** 发送手机验证码*/PostMapping("/code")public Result sendCode(RequestParam("ph…

前端框架对比和选择

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 前端框架选择是前端开发中的关键决策&#xff0c;因为它影响项目的开发效率、维护成本和可扩展性。当前&#xff0c;最流行的前端框架主要包括 React、Vue 和 Angular。它们各有优劣&#xff0c;适用于不同…

wallpaper engine壁纸提取

下载提取软件RavioliGameTools_v2.10.zip https://pan.baidu.com/s/14ZCVw3ucRERsB-GGGoCOqQ 2.运行RExtractor.exe 3.Input file(s)、Output directory填好 4.勾选Allow scanning of unkown files 5.点击Start

智能办公新纪元:AI优秘圈引领未来工作方式

随着人工智能技术的不断进步&#xff0c;它已经开始渗透到我们工作与生活的每一个角落。在这一背景下&#xff0c;AI优秘圈以其创新的智能办公解决方案&#xff0c;正在重新定义企业的工作方式。本文将探讨AI优秘圈如何利用AI技术提升工作效率&#xff0c;降低成本&#xff0c;…

AI换脸等违法行为的最关键原因是个人隐私信息的泄露,避免在网络上发布包含个人敏感信息的照片。

文章目录 引言I 避免在网络上发布包含个人敏感信息的照片不要晒家门钥匙、车牌等照片。不要发布各种票据类的照片不要公布手持身份证或手持白纸照II 相关反制技术的开发和应用III 犯罪案例: 通过“换脸”伪造不雅照当事人犯罪团伙引言 当前AI换脸技术比较成熟,能支持视频通话…

25届和24届一样,涝的涝死旱的旱死

还是秋招 今天无意间翻到一篇帖子&#xff1a; 帖子提到自己的求职经历&#xff1a;想找个产品实习岗&#xff0c;但连实习岗都会要求有相关工作经历... 经典的"蛋生鸡&#xff0c;鸡生蛋"问题。 在经历了完整的秋招后&#xff0c;总的感觉是"涝的涝死&#xff…

基于MATLAB/Simulink的模型降阶方法介绍

降阶建模ROM(Reduced order modeling) 和模型降阶MOR(Model order reduction) 是降低全阶高保真模型的计算复杂性&#xff0c;同时在令人满意的误差范围内保持预期保真度的技术。 模型降阶技术可以解决科学计算邻域在建模仿真与工程应用中的几大痛点&#xff1a; 高保真模型计…

从工厂打螺丝到数据库专家(上)

可能是年纪大了&#xff0c;近期总是失眠&#xff01;不知为何&#xff0c;这段时间心情烦躁时&#xff0c;特别喜欢听老歌&#xff0c;难道这是中年人的通病&#xff1a;都喜欢怀旧&#xff1f; 在数据库恢复订阅伙伴群&#xff0c;大家经常讨论&#xff0c;总是在回味过去&a…