Python实现HTTPS网站证书过期监控及更新

便宜SSL6个月前 (08-05)便宜SSL知识88

当前HTTP逐渐被大众所抛弃,HTTPS正在成为互联网上的主流。前段时间我们维护的一个HTTPS证书即将过期,由于多云环境比较复杂,团队小伙伴在替换更新证书的过程中出现疏漏,导致有一个域名证书没有及时更新,影响了系统可用性,为了杜绝这种问题再次发生,便写了这么个功能


比较简单,但很实用,再也不会出现证书漏更新的问题,具体流程为:扫描域名列表-->检查是否开启HTTPS-->获取证书过期时间-->记录入库-->更新证书

获取域名列表

我们用了很多的内部私有云SAAS服务,这些SAAS服务都提供有完善的API支持,DNS服务便是其中之一,可以根据DNS系统提供的API拿到所有的域名和记录。公有云也提供有完善的API文档,这里以阿里云为例,获取域名记录的代码如下

import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkdomain.request.v20180129.QueryDomainListRequest import QueryDomainListRequest
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest

class DomainApi:
    def __init__(self):
        self.client = client = AcsClient('<accessKeyId>''<accessSecret>''cn-hangzhou')

    def get_domains(self, pagenum=1, pagesize=10):
        try:
            request = QueryDomainListRequest()
            request.set_accept_format('json')
            
            request.set_PageNum(pagenum)
            request.set_PageSize(pagesize)
            
            response = self.client.do_action_with_exception(request)
            jsondata = json.loads(str(response, encoding='utf-8'))
            
            return True, jsondata
        except Exception as e:
            return False, str(e)
            
    def get_records(self, domain):
        try:
            request = DescribeDomainRecordsRequest()
            request.set_accept_format('json')
            
            request.set_DomainName(domain)
            response = self.client.do_action_with_exception(request)

            jsondata = json.loads(str(response, encoding='utf-8'))
            return True, jsondata
        except Exception as e:
            return False, str(e)
            
if __name__ == '__main__':
    print(DomainApi().get_records('ops-coffee.cn'))

以上代码使用了阿里云提供的SDK,调用简单方便,最终返回请求状态及数据。get_domains方法可以获取到账号下的所有域名,get_records方法可以获取到域名下的所有解析记录,需要注意数据量大小,以确定是否需要分页查询

检查是否开启HTTPS

检查是否开启HTTPS也是简单粗暴,直接通过requests模块请求HTTPS地址,没有报错则表示开启了https支持,大概代码如下

session = requests.session()

try:
    session.get('https://' + domain)
except Exception as e:
    print(e)

需要注意的是,如果批量扫描域名的话需要使用session模式,否则可能会因为链接过多而报错

获取证书过期时间

之后再通过pyopenssl模块来拿到域名的HTTPS证书过期时间,代码如下

from _datetime import datetime
from urllib3.contrib import pyopenssl

def get_expire(domain):
    try:
        certificate = pyopenssl.ssl.get_server_certificate((domain, 443))
        data = pyopenssl.OpenSSL.crypto.load_certificate(pyopenssl.OpenSSL.crypto.FILETYPE_PEM, certificate)

        expire_time = datetime.strptime(data.get_notAfter().decode()[0:-1], '%Y%m%d%H%M%S')
        expire_days = (expire_time - datetime.now()).days

        return True, 200, {'expire_time': str(expire_time), 'expire_days': expire_days}
    except Exception as e:
        return False, 500, str(e)
        
if __name__ == '__main__':
    print(get_expire('blog.ops-coffee.cn'))

使用之前需要先安装pyopenssl模块,这里建议使用python3.6及以上版本,除了get_notAfter可以拿到证书过期时间外,还有以下方法能够获取到更多证书相关的信息:get_notAfter,get_notBefore,get_pubkey,get_serial_number,get_signature_algorithm,get_subject,get_version,gmtime_adj_notAfter,gmtime_adj_notBefore,has_expired

定时执行入库

以上步骤会定时执行监控,当发现证书过期时间小于30天时发报警,执行日志就写入了数据库方便前端页面展示

class Domain(models.Model):
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')

    domain = models.CharField(max_length=64, verbose_name='一级域名')
    jsondata = models.TextField(verbose_name='域名详情')

数据库就三个字段,在每次执行完一轮扫码后都会将详细信息计入上表中

jsondata = {
    'items': [{
        'record''blog.ops-coffee.cn',
        'rdtype''A',
        'dept''天玑'
        'enable_https': 1,
        'expire_time''2021-10-22 12:00:00',
        'expire_days''387',
        'notes'''
    }], 
    'total_count': 26,
    'record_a_count': 23,
    'record_a_https_count': 19}

Domain.objects.create(domain='ops-coffee.cn', jsondata=jsondata)

前端获取最新一条数据展示

Domain.objects.filter(domain=domain).order_by('-create_time').first()

更新证书

证书更新是最繁琐的事情,因为涉及到多平台不同环境,每家公司情况可能都有不同,我们因为大量使用了SAAS服务,SAAS服务又提供有API,所以更新起来比较简单,调用API即

class LBCApi:
    def __init__(self):
        self.domain = 'https://lbc.ops-coffee.cn'

        self.headers = {
            'content-type''application/json',
            'Auth-Token': get_auth_token()[1]
        }
        
    def update_cert(self, id, cert):
        try:
            data = json.dumps({"cert": cert})
            r = requests.put(self.domain + '/port/%d' % (id), data=data, headers=self.headers)
    
            if r.status_code != 200:
                return False, r.status_code, r.json()
    
            return True, 200, port['id']
        except Exception as e:
            return False, 500, 'PortId:%s,更新证书失败' % str(e)
            
if __name__ == '__main__':
    state, code, data = LBCApi().update_cert(37, 'cert-ops-coffee-cn')
    print(state, code, json.dumps(data))

搞定收官!KPI++


相关文章

企业网站为什么要安装SSL证书?

什么是SSL?SSL,全称为Secure Sockets Layer(安全套接层)是一种加密算法,它在web网络服务器端口和浏览器端口之间建立加密传输。因此,必须在web网络服务器上安装了SSL证书,才可加密传输,通常表...

Android手机上的SSL连接错误怎么解决?

SSL连接错误已经逐渐成为Android设备上最常见的问题之一,通常我们会收到提醒“您的连接不是私密的”、“此站点证书不受信任”等等。这些安全提示甚至会出现在最新操作系统或者当前操作系统的最新设备上,这可能会让你感到困惑,但是没关系,这篇文...

nginx如何配置https证书

第一步、客户端发送请求,服务器将证书发送给客户端,证书的本质是第三方CA的私钥加密的内容,其内容是服务器的公钥。第二步、客户端接收到证书后,用操作系统和浏览器内置的CA公钥去匹配验证证书,如果能解密,说明请求的是目标网站,不是中间人。第三步...

迫于贫穷,求一个便宜好用的 SSL 证书

目前有一个域名需要解析二级也想用 https,迫于贫穷请大家介绍个好用又实惠的证书,谢谢了。Let's Encrypt 免费而且可以配置通配符example.com *.example.com 签同一张证书上自动更新 Le...

如何获取网站的HTTPS证书?

如果你的网站需要收集敏感信息(包括电子邮件和密码等),那么就需要保证网站的安全。最好的方法之一是启用HTTPS,以便自动加密进出服务器的任何信息,防止黑客窃取和篡改访客的信息。HTTPS超文本传输协议安全,是URL中自动HTTP数据提交协议...

域名型通配符ssl证书的优势及申请方法

ssl证书已经成为每个站点和通讯开发所必需的技术安全产品。有了这个证书,网站的安全性可以得到提高,所以在保护网站信息安全时,企业可以申请ssl证书,然后将证书配置到网站服务器上。目前,比较流行的ssl证书之一是域名型通配符ssl证书,它有许...

什么是组织验证(OV)SSL证书?

组织验证(OV)SSL证书是一种高度保证的SSL证书,用于验证公司/商务/组织类型的证书。商务SSL证书的主要目标是对商业平台使用的网站/业务和用户的敏感信息进行加密。它提出了2048位签名及高达256位的加密强度,证书详情显示组织名称,这...

设置 SSL 的 ClearQuest LDAP 连接信息

如果为 SSL 设置 LDAP 连接信息,那么修改“设置 Rational ClearQuest LDAP 连接信息”中的过程。配置 IBM Rational® ClearQuest® 以使用 LDAP 认证时,需要运行...

微信小程序使用的SSL证书

微信就不做详细的介绍了,都知道是目前中国内地主要的移动手机使用的实时聊天软件。那么微信有了一大创举,那就是微信小程序的应用可以改善了传统手机重复性安装多个APP软件的问题,因为小程序可以让用户不安装软件就可以直接在微信里面大概相应的应用,并...

最熟悉的陌生人——基于共享证书的HTTPS上下文混淆攻击实证研究(三)

论文题目:Talking with Familiar Strangers: An Empirical Study on HTTPS Context Confusion Attacks (本文为ACM CCS 2020录用)论文作者:张明明,...

有哪些SSL证书类型呢?

随着电子商务的发展,SSL证书作为一种类似网站营业执照,其作用和优势越来越明显。许多企业开始为自己的网站申请和安装SSL证书,不同企业要求的SSL证书类型也不同。那么有哪些SSL证书类型呢?一、域名型证书:简称DV SSL。域名型SSL不会...

cloudflare证书颁发机构

Cloudflare may issue certificates for SSL products from any of the following Certificate Authorities (CAs):DigiCertGloba...

Android渗透测试HTTPS证书校验绕过

日常Android渗透过程中,会经常遇见https证书校验(http就不存在证书校验了,直接抓包便可),不能抓取数据包。APP是HTTPS的服务提供方自己开发的客户端,开发者可以先将自己服务器的证书打包内置到自己的APP中,或者将证书签名内...

使用商业认证中心的证书

如果 Rational ClearQuest® 用户来自多个组织,那么您将可能想要使用商业认证中心的证书。如果某些 Rational ClearQuest 用户来自帮助您进行设计或部署的其他组织,那么您将可能希望使用商业认证中心的证书。IB...

自签名SSL证书介绍及其缺点

标准SSL证书由受信任的证书颁发机构(CA)颁发和验证,此类证书使用信任链,其中每个证书都由更可靠的证书签名和信任,此链一直延伸到根证书。SSL证书一般需要付费使用,以致很多没有安全预算的企业选择在网站上使用免费的自签名证书。那么自签名SS...

什么是扩展验证(EV)SSL证书?

扩展验证(EV)SSL证书是目前最高水平的SSL证书。商家信息必须通过SSL证书颁发机构验证后,证明该商家是真实的,才能颁发此证书。部署了EV SSL证书的网站,在URL中直接显示商家名称的绿色地址栏。当用户在URL中看到商家名称时,他很快...

自己制作SSL证书的方法

1. 介绍1.1 介绍如果我们需要一张SSL证书,又不想花钱,又不想麻烦,可以自己制作一个。自己制作的SSL证书的好处是分分钟搞定,简单,快捷。缺点是证书不受信任,浏览器会显示不安全。2. 教程2.1 创建 server.key 文件ope...