Python 3.9.12中ssl.SSLContext.keylog_filename无法生成文件求助
解决Python requests无法通过
ssl.SSLContext.keylog_filename生成SSL密钥日志的问题 问题原因
requests库内部会自行创建SSLContext实例,直接修改ssl.SSLContext类的keylog_filename属性不会作用到这个实例上——因为keylog_filename是实例属性,不是类属性,类属性的修改无法影响已创建或后续新创建的实例的该属性值。
有效解决方法
方法1:手动创建带keylog配置的SSLContext传给requests
直接生成配置好密钥日志路径的SSLContext实例,在requests请求时指定使用该实例:
import ssl import os import requests os.environ["SSLKEYLOGFILE"] = "secrets.log" # 创建默认SSLContext并设置密钥日志文件 ctx = ssl.create_default_context() ctx.keylog_filename = "secrets.log" # 发起请求时传入自定义context req = requests.get('https://google.com', context=ctx)
方法2:全局修改requests的SSLContext配置(会话级生效)
通过自定义HTTP适配器,让requests的会话全局使用带keylog的SSLContext:
import ssl import os import requests from requests.adapters import HTTPAdapter os.environ["SSLKEYLOGFILE"] = "secrets.log" class KeylogHTTPAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): # 初始化带keylog的SSLContext ssl_ctx = ssl.create_default_context() ssl_ctx.keylog_filename = "secrets.log" kwargs['ssl_context'] = ssl_ctx return super().init_poolmanager(*args, **kwargs) # 创建会话并挂载适配器 session = requests.Session() session.mount('https://', KeylogHTTPAdapter()) # 后续会话内的所有HTTPS请求都会使用带keylog的SSLContext req = session.get('https://google.com')
补充说明
sslkeylog.set_keylog()能生效是因为它通过hook底层SSL实现的方式,强制全局输出SSL密钥日志,不需要依赖requests使用的SSLContext配置;而官方ssl模块的keylog_filename需要在具体的SSLContext实例上设置才能生效。
内容的提问来源于stack exchange,提问作者apt45
相关产品推荐
相关产品推荐

