首次请求Vidal API遇SSL错误(Max retries exceeded)如何解决?
看起来你遇到的问题核心不是证书验证(虽然你设置了verify=False),而是Python 2.7自带的SSL库版本过旧,不支持目标服务器要求的TLS协议版本。浏览器能正常访问是因为现代浏览器默认支持最新的TLS协议,而你的Python 2.7环境可能还在用老旧的TLS 1.0/1.1,服务器直接拒绝了握手请求,导致出现SSLEOFError和重试耗尽的错误。
下面是几个可行的解决步骤:
1. 先确认你的SSL和Python版本
先运行这两个命令,看看当前环境的SSL版本:
python -c "import ssl; print(ssl.OPENSSL_VERSION)" python --version
如果你的OpenSSL版本低于1.0.1g,或者Python 2.7版本低于2.7.13,那大概率是协议不兼容的问题——这些旧版本默认不支持TLS 1.2,而现在很多API服务器已经不再接受TLS 1.0/1.1的请求了。
2. 强制指定TLS 1.2协议(临时解决方案)
你可以通过自定义HTTPAdapter来强制requests使用TLS 1.2发起请求,绕过默认的协议限制。修改你的代码如下:
import requests from requests.adapters import HTTPAdapter from requests.packages.urllib3.poolmanager import PoolManager import ssl class TLS12Adapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1_2 ) url = "https://api.vidal.fr/rest/api/products?app_id=MY_ID&app_key=MY_KEY&q=doliprane" session = requests.Session() session.mount('https://', TLS12Adapter()) response = session.get(url, verify=False) print(response.text.encode('utf8'))
这个适配器会强制所有HTTPS请求使用TLS 1.2,很多情况下能解决协议不兼容的问题。
3. 升级Python环境(长期解决方案)
Python 2.7已经在2020年停止了官方维护,不仅存在安全漏洞,而且越来越多的服务不再支持它的SSL协议。最稳妥的办法是升级到Python 3.7+版本,新版本的Python默认支持最新的TLS协议,而且requests库在Python 3下的兼容性更好。
升级后,你的原始代码甚至不需要修改verify=False(当然,建议尽量开启证书验证,除非你确认环境安全),就能正常请求API。
4. 升级requests和urllib3库
如果暂时无法升级Python,至少把requests和urllib3升级到Python 2.7支持的最新版本:
pip install --upgrade requests urllib3
旧版本的requests可能没有正确处理TLS协议的配置,升级后可能会自动适配更合适的协议版本。
额外说明
你提到verify=False无效,是因为这个参数只是跳过证书有效性验证,而你的问题出在TLS握手阶段的协议不匹配——服务器根本没完成握手就断开了连接,和证书验证无关,所以verify=False无法解决这个问题。
内容的提问来源于stack exchange,提问作者cuzureau

