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

使用Invoke-RestMethod请求正常,Python的requests失败,原因是什么?

问题分析

PowerShell的Invoke-RestMethod和Postman可正常发送带Bearer Token的GET请求,但Python的requests模块执行时出现SSL握手失败错误:

SSLError: HTTPSConnectionPool(host='<some_host>', port=443): Max retries exceeded with url: "<url>" (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1133)')))

可能的原因

  • TLS版本不兼容:Python的requests默认使用的TLS版本可能与目标服务器要求不符。PowerShell和Postman会自动适配服务器支持的高版本TLS(如TLS 1.2/1.3),而你的Python环境默认启用的TLS版本偏低,被服务器拒绝握手。可尝试强制指定TLS版本:

    import requests
    import ssl
    from requests.adapters import HTTPAdapter
    from urllib3.poolmanager import PoolManager
    
    class TLSAdapter(HTTPAdapter):
        def init_poolmanager(self, *args, **kwargs):
            ctx = ssl.create_default_context()
            ctx.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1
            kwargs['ssl_context'] = ctx
            return super().init_poolmanager(*args, **kwargs)
    
    url = "some_url"
    headers = {'Authorization': 'Bearer <token>'}
    
    session = requests.Session()
    session.mount('https://', TLSAdapter())
    response = session.get(url, headers=headers)
    
  • 证书验证差异:Postman和PowerShell可能默认跳过了证书验证(或系统已信任服务器证书),但requests默认会严格验证证书。若服务器使用自签名证书或证书链不完整,会触发SSL错误。可临时关闭验证测试(生产环境不推荐):

    response = requests.request("GET", url, headers=headers, verify=False)
    

    或指定信任的证书文件:

    response = requests.request("GET", url, headers=headers, verify="/path/to/certificate.pem")
    
  • 加密套件不匹配:服务器支持的加密套件与requests默认使用的套件不兼容,导致握手失败。PowerShell和Postman支持的加密套件范围更广,因此能成功连接。可通过自定义SSL上下文指定兼容套件,参考上述TLSAdapter示例。

  • Python SSL库版本过旧:你的Python环境依赖的OpenSSL版本太老,不支持服务器要求的加密协议或套件。可升级相关依赖:

    pip install --upgrade requests urllib3
    

    或直接升级Python到较新版本。


内容的提问来源于stack exchange,提问作者cristian hantig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:42:12