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协议版本不匹配导致的。新版本的urllib3requests的底层依赖库)默认禁用了不安全的SSLv3协议,而某些旧服务器可能仍要求使用该协议。

快速解决方案

通过降级urllib3到1.26.5版本可以临时解决此问题:

  1. 打开终端
    在Windows上使用CMD或PowerShell,在macOS/Linux上使用Terminal。

  2. 执行降级命令
    运行以下命令安装指定版本:

    pip install urllib3==1.26.5
  3. 验证安装结果
    确认版本是否正确降级:

    pip show urllib3

    输出中应显示版本号为1.26.5

注意事项

  • 建议在虚拟环境中操作以避免影响其他项目
  • 降级后建议测试所有相关功能是否正常
  • 长期解决方案应是升级服务器端的SSL/TLS配置

更优的长期解决方案

  1. 联系服务提供商升级SSL/TLS配置
  2. 在客户端代码中明确指定支持的协议版本:

    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协议,确保数据传输安全的同时完美兼容各类系统对接需求,避免此类兼容性问题。

更多系统对接方案