文档中心
Python瀹炴垬3绉嶆柟娉曡交鏉捐幏鍙朣SL璇佷功锛堥檮浠g爜绀轰緥锛?txt
时间 : 2025-09-27 16:31:41浏览量 : 3

作为网络安全从业者,我经常需要检查网站的SSL证书信息。今天就用大白话教你用Python获取SSL证书的3种实用方法,并解释这些技术背后的安全原理。
一、为什么要用Python获取SSL证书?
SSL证书就像网站的"身份证",包含域名、有效期、颁发机构等关键信息。我们获取它主要是为了:
1. 自动化监控:批量检查证书是否过期(比如2025年Let's Encrypt根证书过期事件)
2. 安全审计:验证证书链是否完整(防止中间人攻击)
3. 漏洞排查:检测弱加密算法(如已淘汰的SHA-1)
二、方法1:用socket+ssl库(基础版)
这是最直接的方式,适合快速检查单个网站:
```python
import socket
import ssl
def get_cert_basic(hostname):
context = ssl.create_default_context()
with socket.create_connection((hostname, 443)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
cert = ssock.getpeercert()
return cert
示例:查看B站证书
print(get_cert_basic("www.bilibili.com"))
```
输出结果会显示:
- `notBefore`/`notAfter`(有效期)
- `issuer`(颁发机构)
- `subjectAltName`(支持的域名)
安全注意点:
默认不验证证书有效性!实际项目中务必加上:
context = ssl.create_default_context()
context.check_hostname = True
强制验证域名
context.verify_mode = ssl.CERT_REQUIRED
必须校验
三、方法2:用requests库(进阶版)
适合需要处理HTTP请求的场景:
import requests
def get_cert_requests(url):
resp = requests.get(url, verify=True)
cert = resp.connection.sock.getpeercert()
示例:获取知乎证书
print(get_cert_requests("https://www.zhihu.com"))
优势:
- 自动处理HTTPS握手
- 内置证书验证机制
- 支持代理等复杂场景
典型应用场景:
批量扫描企业内网服务的证书状态时,可以配合多线程快速完成。
四、方法3:用cryptography库(专业版)
需要解析证书具体内容时使用:
from cryptography import x509
from cryptography.hazmat.backends import default_backend
def parse_cert(pem_data):
cert = x509.load_pem_x509_certificate(pem_data, default_backend())
print(f"版本: {cert.version}")
print(f"序列号: {cert.serial_number}")
print(f"签名算法: {cert.signature_algorithm_oid}")
示例解析PEM格式证书
with open("cert.pem", "rb") as f:
parse_cert(f.read())
这个方法的特殊价值在于可以:
1. 提取公钥进行加密验证
2. 分析扩展字段(如OCSP必须的AIA扩展)
3. 检测异常签发(比如自签名证书)
五、企业级实践建议
在实际安全运维中,我们通常会结合这些技术:
1. 自动化监控系统
检查证书是否30天内过期
from datetime import datetime
cert = get_cert_basic("example.com")
expiry_date = datetime.strptime(cert['notAfter'], '%b %d %H:%M:%S %Y %Z')
if (expiry_date - datetime.now()).days < 30:
send_alert_email()
2. CSR生成工具
使用cryptography库可以动态生成CSR请求文件,这在自动化部署场景非常有用。
3. 恶意证书检测
通过比对已知黑名单CA的指纹特征:
bad_issuers = ["Superfish Inc", "CNNIC ROOT"]
if any(issuer in cert['issuer'] for issuer in bad_issuers):
block_access()
六、常见问题解答
Q:为什么有时获取不到完整证书链?
A:可能是服务器配置问题,可以用openssl命令测试:
openssl s_client -showcerts -connect example.com:443
Q:如何应对HSTS保护的网站?
A Python默认会遵守HSTS策略,但调试时可以临时禁用:
```python
requests.get(url, verify=False)
仅限测试环境!
建议收藏这些代码片段,下次遇到TLS/SSL相关问题时就能快速诊断。如果对某个细节想深入了解,欢迎在评论区交流!
TAG:python 获取ssl证书,python爬虫ssl错误,python3 ssl,python ssl certificate,python ssl认证,python获取ssl证书信息