ssl新闻资讯

文档中心

Python瀹炴垬3绉嶆柟娉曡交鏉捐幏鍙栧绔疭SL璇佷功锛堥檮浠g爜绀轰緥锛?txt

时间 : 2025-09-27 16:31:41浏览量 : 3

2Python瀹炴垬3绉嶆柟娉曡交鏉捐幏鍙栧绔疭SL璇佷功锛堥檮浠g爜绀轰緥锛?txt

在网络安全工作中,分析对端服务器的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证书信息