文档中心
Python瀹炴垬3绉嶆柟娉曡交鏉惧鍑篐TTPS璇佷功锛堥檮浠g爜绀轰緥锛?txt
时间 : 2025-09-27 16:30:39浏览量 : 3

在网络安全工作中,HTTPS证书是验证网站身份的核心“身份证”。无论是排查中间人攻击、分析证书链有效性,还是批量检测过期证书,都需要快速获取目标网站的证书信息。本文将通过Python代码演示3种主流导出方法(标准库`ssl`、第三方`requests`/`pyOpenSSL`),并深入解析证书字段的实战意义。
一、为什么需要导出HTTPS证书?
1.1 安全工程师的常见场景
- 漏洞排查:某银行分站使用自签名证书(而非权威CA签发),可能存在钓鱼风险
- 合规检查:检测内部系统证书是否使用SHA-1等弱签名算法(如`openssl x509 -text`会显示签名算法)
- 自动化监控:批量扫描子公司域名,提前30天预警证书过期(比如2025年Let's Encrypt大规模过期事件)
1.2 手工查看的局限性
浏览器点击锁图标→查看证书虽然直观,但无法实现:
- 批量导出1000个域名的证书有效期
- 自动对比证书公钥指纹与备案信息是否一致
- 程序化判断是否包含错误的SAN(主题备用名称)
二、方法1:Python标准库ssl(零依赖)
适合快速获取基础信息,无需安装第三方包:
```python
import ssl
import socket
from pprint import pprint
def get_cert_basic(hostname, port=443):
context = ssl.create_default_context()
with socket.create_connection((hostname, port)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
cert = ssock.getpeercert()
pprint(cert)
字典结构展示
return cert
示例:查看知乎的证书信息
get_cert_basic("www.zhihu.com")
```
输出关键字段解析:
{
'subject': ((('CN', '*.zhihu.com'),),),
通用名称
'issuer': ((('C', 'US'), ('O', "DigiCert Inc"),)),
颁发机构
'notBefore': 'Aug 1 00:00:00 2025 GMT',
生效时间
'notAfter': 'Jul 31 23:59:59 2025 GMT',
过期时间??监控重点!
'subjectAltName': [('DNS', '*.zhihu.com'), ...]
SAN扩展列表
}
三、方法2:requests + pyOpenSSL(高级解析)
需要先安装`pip install requests pyOpenSSL`,可获取更完整的X509对象:
import requests
from OpenSSL import crypto
def get_cert_advanced(url):
resp = requests.get(url, verify=True)
cert_pem = resp.raw.connection.sock.getpeercert(binary_form=True)
cert_x509 = crypto.load_certificate(crypto.FILETYPE_ASN1, cert_pem)
print("颁发者:", cert_x509.get_issuer().commonName)
print("有效期至:", cert_x509.get_notAfter().decode())
提取公钥指纹(用于对比可信来源)
fingerprint = cert_x509.digest("sha256").decode()
print("SHA-256指纹:", fingerprint)
get_cert_advanced("https://github.com")
实战技巧:
- 公钥指纹比对:部署CI/CD时校验证书是否被篡改
- OCSP检查:通过`cert_x509.to_cryptography()`调用OCSP装订状态
四、方法3:命令行转储 + Python解析(openssl原生)
适用于需要深度分析的情况,比如提取RSA模数检测弱密钥:
import subprocess
import re
def get_cert_openssl(hostname):
cmd = f"openssl s_client -connect {hostname}:443 -showcerts
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
正则匹配BEGIN CERTIFICATE到END CERTIFICATE之间的内容
certs_pem = re.findall(r'--BEGIN CERTIFICATE--(.*?)--END CERTIFICATE--',
result.stdout, re.DOTALL)
for cert in certs_pem:
print("获取到PEM格式证书:\n", "--BEGIN CERTIFICATE--" + cert + "--END CERTIFICATE--")
get_cert_openssl("baidu.com")
五、安全分析案例实战
假设某次渗透测试中发现目标使用多级证书链,我们需要验证中间CA是否可信:
1. 提取完整链:用方法3获取所有PEM格式证书
2. 逐级验证:将每个中间CA与Mozilla信任列表比对(可用[cacert.pem](https://curl.se/docs/caextract.html))
3. 检测异常:若发现二级CA私钥已泄露(如之前的Symantec事件),则存在链式信任风险
六、与资源推荐
| 方法 | 优点 | 缺点 |
||--|--|
| `ssl`标准库 | Python内置 | ASN.1解析能力有限 |
| `pyOpenSSL` | X509全功能操作 | Windows安装可能报错 |
| openssl命令 | OpenSSL原生支持 | 依赖系统环境 |
扩展工具推荐:
- [crt.sh](https://crt.sh) :在线查询子域名关联的历史证书
- [testssl.sh](https://testssl.sh/) :全面检测TLS/SSL配置
TAG:python导出https证书,python 导出,python 生成证书,python导出html文件,python导出网页excel,python获取https