You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:20:35