mitmproxy新版本TLS握手失败:SHA1签名算法缺失解决方案咨询
解决mitmproxy v9+与仅支持SHA1签名算法的IoT设备TLS握手问题
问题背景
- 使用mitmproxy记录仅支持SHA1签名算法的IoT设备TLS 1.2流量
- mitmproxy v8.0.0可正常工作,升级至v9.0.0+后出现TLS握手失败,OpenSSL提示无共享签名算法,抓包显示mitmproxy未提供SHA1签名算法
- 版本依赖差异:
- v8.0.0:
cryptography>=36,<37、pyOpenSSL>=21.0,<22.1 - v9.0.1:
cryptography>=38.0,<38.1、pyOpenSSL>=22.1,<22.2
- v8.0.0:
- 已尝试操作:
- 自行编译基于OpenSSL 1.1.1n的cryptography 38.0.4,问题依旧
- 降低依赖版本会破坏v9.0.1的API兼容性
- 重新编译v8.0.0的cryptography也无法解决,怀疑与docker镜像
python:3.9-slim-bullseye的OpenSSL环境有关
可行解决方案:修改mitmproxy的TLS签名算法配置
mitmproxy允许通过自定义脚本调整TLS上下文的签名算法套件,无需修改核心依赖或破坏API兼容性,具体步骤如下:
1. 编写自定义mitmproxy脚本
创建Python脚本(例如enable_sha1.py),通过configure钩子修改服务器TLS上下文的签名算法列表:
from mitmproxy import ctx from mitmproxy.proxy.layers.tls import TlsConfig from cryptography.hazmat._oid import SignatureAlgorithmOID def load(l): ctx.log.info("Loaded SHA1 signature enabler script") def configure(updated): if "tlsconfig" in updated: tls_config: TlsConfig = ctx.options.tlsconfig # 获取当前签名算法列表并添加SHA1-RSA项 sig_algs = tls_config.ciphers_server.get_signature_algorithms() sig_algs.append(SignatureAlgorithmOID.RSA_WITH_SHA1) # 更新TLS配置的签名算法 tls_config.ciphers_server.set_signature_algorithms(sig_algs) ctx.log.info(f"Added SHA1-RSA to server signature algorithms: {sig_algs}")
2. 启动mitmproxy时加载脚本
执行以下命令启动mitmproxy,加载自定义脚本:
mitmproxy -s enable_sha1.py
3. 验证配置生效
- 查看mitmproxy日志,确认已成功添加SHA1-RSA签名算法
- 用抓包工具(如Wireshark)检查Server Hello包,确认mitmproxy已包含SHA1相关签名算法
- 测试IoT设备连接,验证TLS握手成功
关键说明
- 该方法直接修改mitmproxy的TLS上下文配置,无需调整底层cryptography或pyOpenSSL版本,不会破坏v9+的API兼容性
- SHA1签名算法存在安全风险,仅建议在无法升级IoT设备的临时场景下使用
- 若使用Docker部署mitmproxy,需将脚本挂载到容器内,并在启动命令中指定加载该脚本
内容的提问来源于stack exchange,提问作者Schr0nk
相关产品推荐
相关产品推荐

