通过python获取SSL证书到期时间

在前面的文章中曾介绍过如何通过openssl命令获取SSL证书的到期时间:通过zabbix监控ssl证书到期时间。
有人反馈实践中这种方式存在缺陷,可能会出现部分域名证书无法获取的情况,报错如下:
140323981043600:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:707:Expecting: TRUSTED CERTIFICATE
0
接下来介绍另一种解决方式——通过python获取SSL证书到期时间,代码如下:
#!/bin/env python3
import ssl
import socket
import datetime
import sys
hostname = ‘baidu.com’
port = 443
context = ssl.create_default_context()
with socket.create_connection((hostname, port)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as sslsock:
cert = sslsock.getpeercert()
expiry_date_str = cert[‘notAfter’]
expiry_date_obj = datetime.datetime.strptime(expiry_date_str, ‘%b %d %H:%M:%S %Y %Z’)
days_left = (expiry_date_obj - datetime.datetime.now()).days
print(days_left)
模板制作方式在此不做描述,可参考之前的文章,通过zabbix监控ssl证书到期时间。

以上就是这一期的分享内容。大家好,我是乐乐,专注运维技术研究与分享,关注我,了解更多运维小知识。如有问题,还可以到乐维社区进行留言提问,与广大运维技术爱好者共同探讨。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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证书需要与服务器进行通信,所以需要有网络连接。如果无法建立连接,脚本会返回适当的错误信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值