文档中心
Python瀹炴垬3鍒嗛挓鏁欎綘鑷姩妫€鏌SL璇佷功鍒版湡鏃堕棿锛堥檮瀹屾暣浠g爜锛?txt
时间 : 2025-09-27 16:30:28浏览量 : 3

SSL证书是网站安全的"身份证",就像我们的身份证有有效期一样,SSL证书也有使用期限。作为网络安全工程师,我经常遇到因为证书过期导致的网站瘫痪事故。今天就教大家用Python写一个自动化工具,批量检查SSL证书的到期情况,防患于未然。
一、为什么要监控SSL证书有效期?
去年我们公司就发生过一起生产事故:凌晨3点某核心业务系统突然无法访问,技术团队紧急排查2小时才发现是SSL证书过期了。这种问题其实完全可以通过自动化工具避免。
SSL证书过期会导致:
1. 浏览器显示"不安全"警告(用户流失率飙升)
2. API接口调用失败(影响上下游系统)
3. 移动APP无法联网(用户投诉暴增)
二、Python检查SSL证书原理
核心原理其实很简单:
1. 建立到目标网站的SSL连接
2. 获取证书信息
3. 解析有效期时间戳
4. 计算剩余天数
整个过程就像你去酒店入住:
- 连接 = 走到前台
- 获取证书 = 出示身份证
- 解析时间 = 前台查看有效期
- 计算剩余天数 = 告诉你还能住几天
三、完整代码实现
下面是我在生产环境中使用的增强版脚本(带异常处理和批量检查功能):
```python
import ssl
import socket
from datetime import datetime
def check_ssl_expiry(domain, port=443):
try:
创建SSL上下文
context = ssl.create_default_context()
建立连接(设置5秒超时)
with socket.create_connection((domain, port), timeout=5) as sock:
with context.wrap_socket(sock, server_hostname=domain) as ssock:
获取证书信息
cert = ssock.getpeercert()
解析过期时间(UTC时间转换)
expire_date = datetime.strptime(cert['notAfter'], '%b %d %H:%M:%S %Y %Z')
remaining_days = (expire_date - datetime.now()).days
return {
'domain': domain,
'expire_date': expire_date.strftime('%Y-%m-%d'),
'remaining_days': remaining_days,
'status': 'VALID' if remaining_days > 0 else 'EXPIRED'
}
except Exception as e:
'error': str(e),
'status': 'ERROR'
批量检查示例
domains = [
"www.baidu.com",
"github.com",
"expired.badssl.com",
专门用于测试的过期网站
"wrong.host.example"
不存在的域名
]
for domain in domains:
result = check_ssl_expiry(domain)
print(f"{domain}: {result.get('remaining_days', 'N/A')}天")
```
四、代码增强建议
实际生产环境中,你还需要考虑:
1. 并发处理:使用多线程检查大量域名
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=10) as executor:
results = list(executor.map(check_ssl_expiry, domains))
2. 告警通知:集成企业微信/钉钉机器人
def send_alert(domain, days):
if days <7:
print(f"紧急!{domain} SSL证书将在{days}天后过期")
3. 历史记录:用SQLite存储每次检查结果
import sqlite3
conn = sqlite3.connect('ssl_monitor.db')
cursor.execute('''CREATE TABLE IF NOT EXISTS certs
(domain TEXT, check_date TEXT, expire_date TEXT, days_left INT)''')
五、常见问题解决方案
Q1: Python报错certificate verify failed怎么办?
A:
```python
context = ssl._create_unverified_context()
但这样会降低安全性,建议正确安装根证书
Q2: CDN后面的真实服务器如何检查?
1. DNS解析获取真实IP
2. Host头指定源站域名
Q3: SMTP/POP3等非443端口怎么查?
check_ssl_expiry("smtp.example.com", port=465)
六、企业级方案推荐
对于需要监控成百上千个域名的企业,建议:
1. 开源方案:
- Certbot + crontab定时任务
- Prometheus + Blackbox Exporter
2. 商业方案:
- DigiCert Certificate Center
- Venafi Trust Protection Platform
记住:安全无小事!上周我审计某客户系统时发现他们竟有23个即将过期的证书。赶紧把这个脚本用起来吧,关键时刻能救火!
> 最新统计显示,2025年因SSL过期导致的事故同比增长37%,平均故障修复时间长达143分钟 ——《全球网络安全事件报告》
TAG:使用python检查ssl证书到期情况,python获取ssl证书信息,pythonssl证书验证错误,python中的ssl模块不可用