Python获取网站证书有效期

  • Python获取网站证书有效期
  • python:OpenSSL和ssl
  • python+shell:subprocess和curl


Python获取网站证书有效期

由于某些原因,需要验证网站证书有效期,从而做出响应的措施来避免一些特殊情况的出现。

python:OpenSSL和ssl

首先考虑使用OpenSSL模块和ssl模块来完成需求,使用OpenSSL之前需要先安装模块-pyOpenSSL。

pip install pyopenssl
import OpenSSL
import ssl


def check_cert_valid():
    # 这里还有一些代码,用来获取域名列表,情况不同,不阐述了
    for domain in domain_list:  # 这里是一些域名的列表,可以使用其他方式
        # 这里我直接使用了下述方法来获取证书,并没有将证书写入文件
        cert = ssl.get_server_certification((domain, 443))  # 一般是443端口,并且这里默认返回
                                                            # 的是PEM证书
        # 如果有cert文件的话,直接执行这里
        # cert_file_path = ''  # cert证书文件路径
        # cert = open(cert_file_path).read()  # 当然这里也可以使用with来进行上下文管理    
        certification = OpenSSL.crypto.load_certification(OpenSSL.crypto.FILETYPE_PEN, cert)
        valid_start_time = certification.get_notBefore()  # 有效期起始时间
        valid_end_time = certification.get_notAfter()  # 有效期结束时间
        pass  #  接下来执行各自的操作即可


if __name__ == '__main':
    check_cert_valid()

python+shell:subprocess和curl

在使用上述方法的时候,大部分域名都是正常的,但是部分域名的有效期不匹配,不清楚原因为何,如果有大佬知道原因,烦请不吝赐教,感谢,之后又尝试了这种方案。

首先需要安装subprocess模块

pip install subprocess
import subprocess


def check_cert_valid():
    # 这里还有一些代码,用来获取域名列表,情况不同,不阐述了
    for domain in domain_list:  # 这里是一些域名的列表,可以使用其他方式
        # curl命令,-k代表不使用认证到达ssl站点,-v显示详情,-s代表静默,-o代表输出
        curl_cmd = "curl https://%s -k -v -s -o /dev/null" % domain[0]
        return_code, output = subprocess.getstatusoutput(domain_str)
        output_groups = re.search(
            'SSL connection using (.*?)\n.*?start date: (.*?)\n.*?expire date: (.*?)\n.*?issuer: (.*?)\n.*?',
            output, re.S)
        if output_groups:
            # 接下来的时间是字符串,可能不符合各位的预期,使用时间格式化来回处理一下即可
            start_date = output_groups.groups()[1]  # 有效期起始时间
            expire_date = output_groups.groups()[2]  # 有效期结束时间
            pass
        pass  #  接下来执行各自的操作即可


if __name__ == '__main':
    check_cert_valid()

但是在这里操作的时候,遇见了乱码的问题,也就是WWW-Authenticate: Basic realm="*******",这里出现了乱码,使用grep -v命令也失败,只能退出求其次,将内容先写入文件,之后再重新读文件,这里走了弯路了,大佬有解决方法的话也忘不吝赐教,感谢,下面跳出来后来的命令。

curl_cmd = "curl https://%s -k -v -s -o /dev/null 2>/tmp/cert.txt;" \
           "cat /tmp/cert.txt| grep -v 'WWW-Authenticate'" % domain[0]