利用python对ssl证书信息进行批量检测-批量检测ssl证书是否过期

主要使用到了Linux中的curl对证书信息进行获取,利用python通过正则截取信息中需要的部分

【直接看下面代码,python3.6  、centos7 测试通过】

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import re
import subprocess
from optparse import OptionParser


def main(domain):

	cmd='curl -lvs https://{}/'.format(domain)
	sslinfo=subprocess.getstatusoutput(cmd)[1]

	print('domain:',domain)
	m=re.search('subject:(.*?)\n.*?start date:(.*?)\n.*?expire date:(.*?)\n.*?common name:(.*?)\n.*?issuer:(.*?)\n',sslinfo)
	print('subject:',m.group(1))
	print('start date:',m.group(2))
	print('expire date:',m.group(3))
	print('common name:',m.group(4))
	print('issuer:',m.group(5))
	print('*'*80)
	pass


if __name__ == '__main__':

	domains=[]
	parser=OptionParser()
	parser.set_usage('python sslinfoGather.py -d domain   \n  	python sslinfoGather.py -f fileName')
	parser.add_option('-d','--domain',dest='domainName',help=' put the domain name')
	parser.add_option('-f','--file',dest='fileName',help=' put the fileName which cotains domains;one line one domain')

	options,_=parser.parse_args()
	if(options.domainName==None and options.fileName==None):
		# parser.print_usage()
		parser.print_help()
		exit()
	if options.domainName!=None:
		domains.append(options.domainName)

	if options.fileName!=None:
		f=open(options.fileName)
		for domain in f:
			domains.append(domain)

	if len(domains)>0:
		# domains=['www.baidu.com','www.sina.cn','www.jd.com']
		for domain in domains:
			try:
				main(domain)
			except Exception as e:
				print('use python3 please\nError info:',str(e))
				exit()
			
	else:
		print('input wrong ,check again!!!')

测试结果1:从文件中读取域名信息

 

测试结果2:从命令行直接读取域名信息

各位如果有需要,可以修改脚本根据证书的起止时间判断证书是否即将过期

 

 

 

 

### 回答1: import ssl import socket import datetimedomain_list = ["domain1.com", "domain2.com", "domain3.com"]for domain in domain_list: print("查看域名 " + domain + " 的 SSL 证书过期时间:") ssl_date_fmt = r'%b %d %H:%M:%S %Y %Z' try: hostname = domain context = ssl.create_default_context() s = context.wrap_socket(socket.socket(), server_hostname=hostname) s.connect((hostname, 443)) certificate = s.getpeercert() expire_date = datetime.datetime.strptime(certificate['notAfter'], ssl_date_fmt) print(expire_date) except Exception as e: print(e) ### 回答2: 您好!以下是一段可以从客户端批量查看域名SSL证书过期时间的Python脚本: ```python import ssl import socket from datetime import datetime # 客户端域名列表 domain_list = ['example.com', 'google.com', 'facebook.com'] def get_ssl_expiry(domain): try: # 获取SSL证书的有效期 cert = ssl.get_server_certificate((domain, 443)) x509 = ssl.PEM_cert_to_X509(cert) cert_info = x509.get_notAfter().decode('utf-8') # 将日期字符串转换为日期对象 expiry_date = datetime.strptime(cert_info, '%Y%m%d%H%M%SZ') return expiry_date except Exception as e: print(f"无法获取域名 {domain} 的SSL证书信息:{e}") # 批量查看域名SSL证书过期时间 for domain in domain_list: expiry_date = get_ssl_expiry(domain) if expiry_date: days_left = (expiry_date - datetime.now()).days print(f"域名 {domain} 的SSL证书将于 {expiry_date} 过期,还有 {days_left} 天。") ``` 请注意,以上代码仅限于检查域名的SSL证书过期时间,且仅适用于默认的HTTPS端口(443)。此外,需要确保您的计算机已安装了Pythonssl模块。 希望对您有帮助! ### 回答3: 以下是一个可以从客户端批量查看域名的SSL证书过期时间的Python脚本示例: ```python import ssl import socket import datetime def get_ssl_expiry(hostname): try: ssl_date_fmt = r'%b %d %H:%M:%S %Y %Z' context = ssl.create_default_context() conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=hostname) conn.settimeout(2) # 设置连接超时时间为2秒 conn.connect((hostname, 443)) ssl_info = conn.getpeercert() # 解析证书过期日期 expiry_date = datetime.datetime.strptime(ssl_info['notAfter'], ssl_date_fmt) conn.close() return expiry_date except ssl.SSLError: return '获取SSL证书失败' except socket.gaierror: return '无法解析主机名' except socket.timeout: return '连接超时' if __name__ == '__main__': # 输入要查看的域名列表 domains = ['example.com', 'google.com', 'github.com'] for domain in domains: expiry_date = get_ssl_expiry(domain) # 打印结果 if isinstance(expiry_date, datetime.datetime): print(f'{domain} SSL证书过期时间:{expiry_date}') else: print(f'{domain} 错误信息:{expiry_date}') ``` 脚本的工作原理是使用`ssl`和`socket`库与服务器建立安全连接,并获取SSL证书过期日期。脚本首先通过`wrap_socket`方法将socket连接包装成SSL连接,然后通过`getpeercert`方法获取证书信息,包括过期日期。最后,脚本打印出每个域名的SSL证书过期时间。 请注意,脚本使用了固定的端口443来与服务器建立连接,这是HTTPS默认的端口。如果你想要使用不同的端口,可以修改`conn.connect`的参数。 由于获取SSL证书需要与服务器进行通信,所以需要有网络连接。如果无法建立连接,脚本会返回适当的错误信息
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿雷由

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值