Python requests调用接口报SSLError(SSLEOFError)是什么原因
报错触发原因
requests.exceptions.SSLError伴随EOF occurred in violation of protocol错误的核心原因是客户端与hacker-news.firebaseio.com的TLS握手流程被意外中断,未完成正常的SSL协商,常见触发场景如下:
- 本地网络存在流量拦截:公司/校园网防火墙、上网行为审计工具、本地开启的抓包软件(Fiddler/Charles等)、配置错误的代理/VPN会篡改TLS握手包,中间人代理未正确完成SSL协商就断开连接
- 本地SSL相关依赖版本过旧:Python内置OpenSSL版本过低、
requests或依赖的certifi证书库版本太旧,不支持目标站点要求的TLS 1.2+协议,连接会被服务端直接重置 - 临时网络故障:到目标服务器的路由丢包、运营商链路波动,会偶发连接中断触发该报错
排查修复步骤
按照从易到难的顺序操作即可定位解决问题:
- 验证基础网络连通性
直接在本地浏览器访问目标接口地址https://hacker-news.firebaseio.com/v0/topstories.json,如果浏览器无法正常返回JSON数据,先排查本地网络:关闭抓包工具、异常代理/VPN,确认网络可以正常连通Firebase服务,内网环境联系管理员确认域名没有被拦截。 - 定位是否为证书校验问题
临时添加verify=False参数跳过证书验证测试(注意:该配置仅用于本地排查,禁止在生产环境使用,会带来中间人攻击风险),测试代码如下:
import requests import urllib3 # 关闭跳过证书验证产生的告警 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) url = 'https://hacker-news.firebaseio.com/v0/topstories.json' r = requests.get(url, verify=False) print('Status code:', r.status_code)
如果修改后可以正常请求,说明问题出在证书校验环节,直接执行命令升级相关依赖即可:pip install --upgrade requests certifi
3. 检查TLS版本兼容性
如果升级依赖后仍报错,执行以下代码查看本地OpenSSL版本:
import ssl print(ssl.OPENSSL_VERSION)
如果输出的OpenSSL版本低于1.0.1,或者当前使用的Python版本低于3.7,直接升级到Python 3.7及以上版本即可——该版本后Python默认启用TLS 1.2支持,内置的OpenSSL版本满足Firebase服务的连接要求。
4. 适配偶发网络波动
如果是网络不稳定导致的偶发报错,可以给请求添加自动重试机制,参考代码:
import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry # 配置重试策略 session = requests.Session() retry_config = Retry( total=3, # 最多重试3次 backoff_factor=1, # 重试间隔退避系数 status_forcelist=[429, 500, 502, 503, 504] # 遇到指定状态码才重试 ) session.mount("https://", HTTPAdapter(max_retries=retry_config)) url = 'https://hacker-news.firebaseio.com/v0/topstories.json' r = session.get(url) print('Status code:', r.status_code)
内容的提问来源于stack exchange,提问作者Payam_2021
相关产品推荐
相关产品推荐

