Cannot establish TLS with client: TlsException("SSL handshake error")

本文解决了使用mitmproxy在Python环境下忽略所有HTTPS/SSL主机的问题。通过执行特定命令,可以实现代理下正常的数据抓取,适用于mitmproxy与手机端的配合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mitmproxy & python - ignore all hosts with https/ssl

PC端安装mitmproxy,生成证书,并在手机端安装android证书,然后设置手机ip代理,仍然报错,错误如下图
在这里插入图片描述
找了两天终于在stackoverflow找到了解决办法。转载自> https://stackoverflow.com/questions/53309111/mitmproxy-python-ignore-all-hosts-with-https-ssl

解决方法

执行如下命令即可:mitmproxy -s tls_passthrough.py
tls_passthrough.py的具体内容就不贴了,有需要的可以直接去github上去下载https://github.com/mitmproxy/mitmproxy/blob/master/examples/complex/tls_passthrough.py
执行上述命令之后即可正常使用:
在这里插入图片描述

<think>好的,我现在需要解决用户关于TLS握手错误的问题,具体错误是“error:1408F10B:SSL routines:ssl3_get_record:wrong version number”。首先,我得理解这个错误的含义和常见原因。 用户可能遇到了与SSL/TLS连接相关的问题,这个错误通常发生在客户端和服务器之间尝试建立安全连接时。根据错误代码,错误提示指出“wrong version number”,也就是版本号不对。这可能意味着客户端和服务器在TLS协议版本上不兼容。 接下来,我需要回忆一下TLS握手的过程。在握手阶段,客户端会发送ClientHello消息,其中包含支持的TLS版本列表。服务器选择其中一个版本并回复ServerHello。如果服务器不支持客户端提供的任何版本,或者客户端尝试使用过低的版本(比如SSLv3),而服务器已经不再支持,可能会导致此错误。 接下来考虑可能的原因。首先,客户端可能配置了过时的TLS版本,比如SSLv3,而服务器要求更高的版本如TLS 1.2或1.3。另外,也有可能是服务器没有正确配置TLS,或者客户端错误地连接到非SSL端口,比如HTTP而不是HTTPS,导致服务器返回非SSL响应,客户端误以为是SSL数据,从而解析错误版本号。 然后需要思考如何验证这些可能性。用户可以检查客户端使用的TLS版本,例如在OpenSSL命令中指定版本,或者检查代码中的SSL配置。同时,确认连接的端口是否正确,比如443端口用于HTTPS。此外,使用工具如openssl s_client或在线检测工具测试服务器支持的协议版本可能会有帮助。 另外,服务器端的配置也需要检查,确保它支持现代TLS版本,并且没有错误配置。防火墙或中间设备可能干扰了连接,修改了数据包,导致版本号错误。比如,有些安全设备可能会拦截SSL流量,导致不兼容。 最后,解决方案可能包括更新客户端或服务器的TLS配置,使用更现代的协议版本,确保端口正确,检查网络中间设备,以及验证证书配置是否正确。可能需要具体指导用户如何执行这些检查,例如提供openssl命令示例,或者建议查看服务器日志。 需要确保回答清晰,分步骤说明可能的原因和解决方法,帮助用户逐步排查问题。同时,使用中文,避免技术术语过于复杂,让用户容易理解。</think>当你在网络通信中遇到 `TLS handshake error: error:1408F10B:SSL routines:ssl3_get_record:wrong version number` 错误时,通常表示 **客户端与服务器在 TLS 协议版本协商时出现不兼容**。以下是逐步分析与解决方案: --- ### **错误原因分析** 1. **协议版本不匹配** - 客户端尝试使用过时的 TLS/SSL 协议版本(如 SSLv3),而服务器已禁用对旧版本的支持。 - 服务器可能仅支持更高版本的 TLS(如 TLS 1.2、1.3),但客户端未正确配置或未声明支持这些版本。 2. **端口或协议误用** - 客户端可能尝试在非 SSL/TLS 端口(如 HTTP 的 80 端口)上建立加密连接。 - 服务器返回的响应不是合法的 TLS 握手数据(例如返回了普通 HTTP 响应),导致客户端解析失败。 3. **中间设备干扰** - 防火墙、代理或负载均衡器可能修改了流量,破坏了 TLS 握手过程。 --- ### **逐步排查与解决方案** #### **1. 检查客户端配置** - **强制使用现代 TLS 版本** 如果使用 OpenSSL 或类似库,确保客户端声明支持 TLS 1.2+。例如,在 OpenSSL 命令中指定版本: ```bash openssl s_client -connect example.com:443 -tls1_2 ``` - **禁用过时协议** 在代码中显式禁用 SSLv3 和旧版 TLS(以 Python 为例): ```python import ssl context = ssl.create_default_context() context.options |= ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 ``` #### **2. 验证服务器配置** - **测试服务器支持的协议** 使用工具检查服务器支持的 TLS 版本: ```bash openssl s_client -connect example.com:443 -tls1_2 openssl s_client -connect example.com:443 -tls1_3 ``` 如果返回 `SSL handshake has read ...` 且成功建立连接,说明服务器支持该版本。 - **在线检测工具** 使用 [SSL Labs Server Test](https://www.ssllabs.com/ssltest/) 分析服务器的 TLS 配置,确保未禁用现代协议。 #### **3. 确认端口和协议** - **检查端口是否正确** TLS/SSL 通常运行在 443 端口。若使用其他端口(如 80),需确认服务器是否在该端口上启用了 TLS。 - **验证协议类型** 如果服务器是 HTTP 服务而非 HTTPS,客户端尝试 TLS 握手会直接失败。例如,对 `http://example.com` 使用 HTTPS 连接会导致此错误。 #### **4. 排查中间设备干扰** - **临时禁用防火墙/代理** 测试在绕过防火墙或代理的情况下是否能成功建立连接。若问题消失,需检查中间设备的配置。 - **抓包分析** 使用 Wireshark 或 `tcpdump` 捕获流量,观察 TLS 握手阶段的数据包: ```bash tcpdump -i any -w capture.pcap port 443 ``` 检查 `ClientHello` 和 `ServerHello` 中的协议版本是否匹配。 #### **5. 其他可能原因** - **证书问题** 虽然此错误直接与协议版本相关,但证书配置错误(如证书链不完整)可能间接导致握手失败。确保服务器证书有效且配置正确。 - **客户端/服务器库版本过旧** 更新客户端或服务器的 SSL/TLS 库(如 OpenSSL、BoringSSL)至最新版本。 --- ### **总结** 该错误的根本原因是 **客户端与服务器未能协商出兼容的 TLS 协议版本**。优先检查以下方面: 1. 客户端强制使用 TLS 1.2+。 2. 服务器支持现代协议且未禁用旧版本。 3. 连接的是正确的 HTTPS 端口(443)。 4. 中间设备未篡改流量。 通过逐步排查,通常可以定位并解决问题。如果问题持续,提供完整的错误日志和抓包数据有助于进一步分析。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗雅颂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值