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

在网络安全工作中,分析对端服务器的SSL证书是常见需求。比如检查证书是否过期、验证域名是否匹配,甚至排查中间人攻击痕迹。今天我们就用Python手把手教你3种实战方法,附带代码示例和避坑指南!
一、为什么要获取对端SSL证书?
SSL证书就像网站的“身份证”,包含颁发机构、有效期、公钥等关键信息。通过获取它,我们可以:
- 安全审计:检查证书是否由可信CA签发(比如发现自签名证书需警惕)
- 漏洞排查:识别过期或弱加密算法(如SHA-1已不安全)
- 自动化监控:定期扫描业务域名证书状态
案例:某电商网站因证书过期导致用户无法访问,用Python脚本提前7天监测到并告警,避免了损失。
二、方法1:用`ssl`库直接握手(最基础)
Python内置的`ssl`库能直接与目标服务器建立SSL连接并获取证书:
```python
import ssl, socket
def get_cert(host, port=443):
context = ssl.create_default_context()
with socket.create_connection((host, port)) as sock:
with context.wrap_socket(sock, server_hostname=host) as ssock:
cert = ssock.getpeercert()
获取证书信息
return cert
示例:获取百度的证书
print(get_cert("www.baidu.com"))
```
输出结果是字典格式的证书字段,比如`notAfter`表示过期时间。
?? 注意点:
1. 如果服务器不支持SNI(如老旧系统),需设置`server_hostname=None`。
2. 遇到自签名证书会报错,可添加`context.check_hostname = False`跳过验证(仅限测试环境!)。
三、方法2:用`requests`+底层解析(适合HTTPS爬虫)
如果你已经使用`requests`库爬取网页,可以这样提取证书:
import requests
from pprint import pprint
resp = requests.get("https://www.baidu.com", timeout=5)
cert_info = resp.connection.sock.getpeercert()
从连接对象提取
pprint(cert_info)
? 优势:无需额外建立连接,复用现有请求。
四、方法3:用OpenSSL命令行+Python解析(高级玩法)
如果需要更详细的X.509字段(如序列号、扩展项),可调用OpenSSL工具链:
import subprocess
import re
def openssl_get_cert(host, port=443):
cmd = f"openssl s_client -connect {host}:{port} -showcerts /dev/null"
output = subprocess.check_output(cmd, shell=True).decode()
用正则提取PEM格式的证书块
cert_pem = re.findall(r"--BEGIN CERTIFICATE--(.*?)--END CERTIFICATE--", output, re.DOTALL)[0]
return cert_pem
调用示例
cert_text = openssl_get_cert("github.com")
print(cert_text)
PEM格式的完整证书
?? 扩展应用:将PEM格式传给`cryptography`库还能解析更多细节(如公钥算法):
from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend
cert_obj = load_pem_x509_certificate(cert_text.encode(), default_backend())
print("序列号:", cert_obj.serial_number)
print("签发者:", cert_obj.issuer.rfc4514_string())
```
五、常见问题与解决方案?
1. 超时错误:目标服务器防火墙可能拦截443端口,尝试调整`socket.setdefaulttimeout(10)`。
2. 证书链不完整:部分服务器未返回中间CA证书,可通过Wireshark抓包对比。
3. IPV6问题:若域名解析到IPV6地址导致失败,强制使用IPV4`socket.AF_INET`。
六、实际应用场景 ???
- 自动化巡检工具:结合APScheduler定时检查所有域名证书状态。
- 恶意软件分析:提取C2服务器的SSL证书指纹进行威胁情报匹配。
> ?? 最佳实践建议:生产环境中建议添加异常重试机制和日志记录功能。
通过这几种方法,你可以灵活应对不同场景下的SSL证书获取需求。如果有更多疑问,欢迎在评论区交流!
TAG:python获取对端ssl证书,python项目的ssl证书怎么配,python3 ssl,python获取ssl证书信息