使用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
相关产品推荐
相关产品推荐

