如何在Python的urllib3中获取HTTPS请求后的服务器证书?
在urllib3中发起HTTPS请求后获取服务器证书的方法
当然可以获取服务器证书,urllib3支持在成功建立HTTPS连接后提取服务器返回的证书信息,以下是具体操作方式:
基础获取方式(字典格式证书信息)
通过请求返回的HTTPResponse对象,可直接获取解析后的证书字典:
import urllib3 # 初始化连接池管理器 http = urllib3.PoolManager() # 发起HTTPS请求 response = http.request('GET', 'https://example.com') # 获取服务器证书(字典格式) server_cert = response.connection.sock.getpeercert() # 输出证书关键信息 print("证书主体:", server_cert['subject']) print("证书颁发者:", server_cert['issuer']) print("有效期起始:", server_cert['notBefore']) print("有效期截止:", server_cert['notAfter'])
getpeercert()返回的字典包含了证书的核心字段,适合快速查看基础信息。
获取原始证书并解析详细内容
如果需要更完整的证书细节(比如扩展字段、签名算法等),可以获取原始DER格式证书,再用cryptography库解析:
import urllib3 from cryptography import x509 from cryptography.hazmat.backends import default_backend http = urllib3.PoolManager() response = http.request('GET', 'https://example.com') # 获取DER编码的原始证书字节串 der_cert = response.connection.sock.getpeercert(True) # 解析DER证书为X.509对象 cert_obj = x509.load_der_x509_certificate(der_cert, default_backend()) # 提取详细证书信息 print("证书主体:", cert_obj.subject.rfc4514_string()) print("证书颁发者:", cert_obj.issuer.rfc4514_string()) print("签名算法:", cert_obj.signature_algorithm_oid._name) print("有效期起始:", cert_obj.not_valid_before) print("有效期截止:", cert_obj.not_valid_after)
注意事项
- 仅当HTTPS连接成功建立(包括证书验证通过)时,才能通过上述方式获取证书;若连接失败(如证书不被信任、网络错误),则无法提取。
- 若使用
ProxyManager或自定义连接池,只要能获取到对应的连接对象,同样可以调用getpeercert()方法获取证书。
内容的提问来源于stack exchange,提问作者Seva Alekseyev
相关产品推荐
相关产品推荐

