Python获取网站证书有效期
- Python获取网站证书有效期
- python:OpenSSL和ssl
- python+shell:subprocess和curl
Python获取网站证书有效期
由于某些原因,需要验证网站证书有效期,从而做出响应的措施来避免一些特殊情况的出现。
python:OpenSSL和ssl
首先考虑使用OpenSSL模块和ssl模块来完成需求,使用OpenSSL之前需要先安装模块-pyOpenSSL。
pip install pyopenssl
import OpenSSL
import ssldef 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 subprocessdef 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] # 有效期结束时间passpass # 接下来执行各自的操作即可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]