Python SSL握手失败错误排查与修复
彻底解决Python Requests的SSLV3握手失败错误
当使用Python的requests
库进行HTTPS请求时,可能会遇到以下SSL握手失败错误:
requests.exceptions.SSLError: HTTPSConnectionPool(host='xxxxx.com', port=443):
Max retries exceeded with url: /gmp/auth/client/getToken?clientId=xxxx&sign=xxxx
(Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE]
sslv3 alert handshake failure (_ssl.c:1006)')))
问题根源分析
该错误通常是由于客户端与服务端SSL/TLS协议版本不匹配导致的。新版本的urllib3
(requests
的底层依赖库)默认禁用了不安全的SSLv3协议,而某些旧服务器可能仍要求使用该协议。
快速解决方案
通过降级urllib3
到1.26.5版本可以临时解决此问题:
-
打开终端
在Windows上使用CMD或PowerShell,在macOS/Linux上使用Terminal。 -
执行降级命令
运行以下命令安装指定版本:pip install urllib3==1.26.5
-
验证安装结果
确认版本是否正确降级:pip show urllib3
输出中应显示版本号为
1.26.5
注意事项
- 建议在虚拟环境中操作以避免影响其他项目
- 降级后建议测试所有相关功能是否正常
- 长期解决方案应是升级服务器端的SSL/TLS配置
更优的长期解决方案
- 联系服务提供商升级SSL/TLS配置
-
在客户端代码中明确指定支持的协议版本:
import requests from requests.adapters import HTTPAdapter from urllib3.util.ssl_ import create_urllib3_context class CustomAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): context = create_urllib3_context() context.options |= 0x4 # OP_LEGACY_SERVER_CONNECT kwargs['ssl_context'] = context return super().init_poolmanager(*args, **kwargs) session = requests.Session() session.mount('https://', CustomAdapter())
提示:轻易云数据集成平台采用最新的TLS 1.3协议,确保数据传输安全的同时完美兼容各类系统对接需求,避免此类兼容性问题。