首页 > 编程语言 >使用Python对HTTPS域名证书管理与验证

使用Python对HTTPS域名证书管理与验证

时间:2023-08-28 15:31:55浏览次数:40  
标签:certificate get Python 证书 cert datetime 域名 HTTPS print

随着业务的发展,很多域名都需要使用HTTPS。这就带来了一个新的问题:如何监控HTTPS域名证书的有效性。虽然证书不是一刹那过期的,但是也需要对其进行监控。了解其有效时间,并在过期前进行报警监控。

要完成这些功能,所限就是要对证书进行解析。对证书解析可以使用python的OpenSSL库,以下为示例代码:

import OpenSSL
import time
from dateutil import parser
cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open("hrs100.com.pem").read())
certIssue = cert.get_issuer()
print("",cert.get_subject())
print("issuer",cert.get_issuer())
print("证书版本:            ",cert.get_version() +1)
print("证书序列号:          ",hex(cert.get_serial_number()))
print("证书中使用的签名算法: ",cert.get_signature_algorithm().decode("UTF-8"))
print("颁发者:              ",certIssue.commonName)
datetime_struct = parser.parse(cert.get_notBefore().decode("UTF-8"))
print("有效期从:            ",datetime_struct.strftime('%Y-%m-%d %H:%M:%S'))
datetime_struct = parser.parse(cert.get_notAfter().decode("UTF-8"))
print("到:                  ",datetime_struct.strftime('%Y-%m-%d %H:%M:%S'))
print("证书是否已经过期:      ",cert.has_expired())
print("公钥长度",cert.get_pubkey().bits())
print("公钥:\n",OpenSSL.crypto.dump_publickey(OpenSSL.crypto.FILETYPE_PEM, cert.get_pubkey()).decode("utf-8"))
print("主体信息:")
print("CN : 通用名称  OU : 机构单元名称")
print("O  : 机构名    L  : 地理位置")
print("S  : 州/省名  C  : 国名")
for item in certIssue.get_components():
    print(item[0].decode("utf-8"),"  ——  ",item[1].decode("utf-8"))
    print(cert.get_extension_count())

这个示例是证书文件可见的情况下使用,还可以通过curl访问的方式对证书信息进行获取,以下为实例代码:

import socket
from OpenSSL import SSL
import certifi
from datetime import datetime


def convert_to_human_readable(utc_date):
    # 将字节串转换为字符串
    utc_date_str = utc_date.decode('utf-8')

    # 解析字符串为datetime对象
    utc_datetime = datetime.strptime(utc_date_str, "%Y%m%d%H%M%SZ")

    # 转换为本地时间并返回
    local_datetime = utc_datetime.astimezone()
    return local_datetime.strftime("%Y-%m-%d %H:%M:%S")


def get_certificate_info(domain):
    try:
        context = SSL.Context(SSL.SSLv23_METHOD)
        context.load_verify_locations(certifi.where())

        conn = SSL.Connection(context, socket.socket(socket.AF_INET))
        conn.connect((domain, 443))
        conn.set_tlsext_host_name(domain.encode('utf-8'))
        conn.do_handshake()

        cert = conn.get_peer_certificate()
        conn.close()

        return cert
    except Exception as e:
        return None


def main():
    domain = "baidu.com"  # 您要查询的域名
    certificate_info = get_certificate_info(domain)

    if certificate_info:
        print("证书信息:")
        print("颁发者:", certificate_info.get_issuer())
        print("主题:", certificate_info.get_subject())

        expiration_date = certificate_info.get_notAfter()
        human_readable_date = convert_to_human_readable(expiration_date)
        print("过期日期:", human_readable_date)
    else:
        print("无法获取证书信息。")


if __name__ == "__main__":
    main()

通过实例代码,可以获取证书的各种信息。其中就包括到期时间。通过对到期时间与当前时间的判断,就可以通过例如钉钉微信的工具进行通知提醒。


标签:certificate,get,Python,证书,cert,datetime,域名,HTTPS,print
From: https://blog.51cto.com/quietguoguo/7264407

相关文章

  • post data http or https
    classProgramTest{staticvoidMain(string[]args){stringurl="https://www.test.com";stringresult=PostUrl(url,"key=123");//key=4da4193e-384b-44d8-8a7f-2dd8b076d784Con......
  • python dict(zip()) 用法
    下面是一篇关于 dict(zip()) 用法的博客文章:Python中的 dict(zip()) 是一种结合使用内置函数 dict() 和 zip() 的方法。zip() 函数用于从多个可迭代对象(如列表、元组、集合等)中提取元素,并将相应的元素配对在一起。配对的元素以元组的形式返回。dict() 函数接受一个由......
  • Python爬虫实战 - 模拟登录采集数据
    在进行数据采集时,有些网站需要进行登录才能获取到所需的数据。本文将介绍如何使用Python爬虫进行模拟登录,以便采集网站的数据。我们提供了完善的方案和代码示例,让你能够轻松操作并获取所需的数据。使用Python爬虫模拟登录网站采集数据价值:数据获取:通过模拟登录,你可以通过网站的登录......
  • 批量python爬虫采集性能优化之减少网络延迟的方法
    今天,我们将一起探讨批量爬虫采集的性能优化,特别关注减少网络延迟的方法。网络延迟是爬虫程序中一个常见的性能瓶颈,通过优化网络延迟,我们可以提高爬虫程序的采集速度和效率。让我们一起来看看如何实现这一目标。1.使用异步请求传统的同步请求方式会导致爬虫程序在等待服务器响应时浪......
  • Docker 搭建本地 https 环境
    目录1.生成自签名的SSL证书和私钥2.编辑Nginx的Dockerfile文件3.编辑YAML文件4.准备nginx主配置文件5.运行以下命令启动容器6.添加网页主页7.测试环境:安装Docker安装docker-compose1.生成自签名的SSL证书和私钥首先,生成自签名的SSL证书和私钥。可以使用......
  • 让用户访问Tomcat时强制跳转到Https方式
    让用户访问Tomcat时强制跳转到Https方式。首先配置Tomcat可以在Https下运行,相应的配置,请查看其它说明文档。http://www.iteye.com/topic/78274修改tomcat/conf/web.xml文件,在</welcome-file-list>下面加上如下语句<login-config><!--Authorizatio......
  • python+playwright 学习-77 playwright 发送接口请求APIRequestContext
    前言每个Playwright浏览器上下文都有与其关联的APIRequestContext实例,该实例与浏览器上下文共享cookie存储,可以通过browser_context.request或page.request访问。也可以通过调用api_request.new_context()手动创建一个新的APIRequest上下文实例。通过浏览器发请求可以通过browser......
  • 使用python监控HDFS文件的增量【优化中】
    1.目录1、需求和步骤2、项目结构3、项目代码    3.1建表语句hdfs_Ctreate_table    3.2删除文件记录hdfs_delete_file_record.py    3.3文件路径的小时监控hdfs_path_Monitor.py    3.4文件路径的天监控hdfs_path_Monitor_day.py    3.5文......
  • python使用docx向word文档中表格插入图片并固定缩放
    使用python的docx模块对word文档进行编辑时,有时候需要向表格中插入图片,但是插入的图片一般是按照原图片的大小插入的,即使你的word文档一开始就设置好了固定宽高,似乎也是不起作用,这个时候就需要在插入后,用python去调整图片的宽高。示例代码:fromdocximportDocumentfromdocxi......
  • python 高效处理EXCEL对比
    #coding=utf-8importxlwingsasxwimportpandasaspdimporttime#记录打开表单开始时间start_open_time=time.time()#指定不显示地打开Excel,读取Excel文件app=xw.App(visible=False,add_book=False)wb=app.books.open('D:/PYTHON/TEST_CODE/Book300s.xlsx')#......