ssl新闻资讯

文档中心

Python瀹炴垬3绉嶆柟娉曡交鏉惧鍑篐TTPS璇佷功锛堥檮浠g爜绀轰緥锛?txt

时间 : 2025-09-27 16:30:39浏览量 : 3

2Python瀹炴垬3绉嶆柟娉曡交鏉惧鍑篐TTPS璇佷功锛堥檮浠g爜绀轰緥锛?txt

在网络安全工作中,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