Python2.6+requests2.9.1请求无限等待,curl正常的技术求助
问题分析与解决:Python2.6 + requests2.9.1 HTTPS请求无限等待
问题根源
从报错信息里的SNIMissingWarning和InsecurePlatformWarning可以直接定位核心问题:Python2.6的原生SSL模块不支持SNI(服务器名称指示)。
目标服务器是基于SNI配置的虚拟主机,要求客户端在SSL握手阶段发送SNI信息以匹配对应证书。curl依赖的NSS库支持SNI,浏览器也原生支持,所以能正常完成请求;但Python2.6的ssl模块缺乏该能力,导致服务器无法返回正确证书,握手流程卡住,最终陷入无限等待。
解决方案
方案1:补全SNI支持依赖
给Python2.6安装三个扩展包,替换requests底层的SSL实现,补上SNI支持:
pip install pyopenssl ndg-httpsclient pyasn1
安装完成后重新运行请求代码,即可正常完成SSL握手。
方案2:强制指定TLS版本(临时 workaround)
如果安装依赖存在障碍,可以尝试强制指定服务器支持的TLSv1.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://b3-reader.ew1-wip.umm.is-pr.com/abcd/healthstatus" session = requests.Session() session.mount('https://', TLS12Adapter()) # 务必添加超时参数,避免再次出现无限等待 response = session.get(url, verify=False, timeout=10) print(response.status_code)
方案3:升级Python版本(长期根治)
Python2.6已停止维护多年,不仅SSL支持落后,还存在大量未修复的安全漏洞。如果业务允许,建议升级到Python3.6及以上版本,从根源解决这类兼容性问题。
额外提醒
无论采用哪种方案,都建议给requests.get()添加timeout参数,避免请求因异常再次陷入无限等待。
内容的提问来源于stack exchange,提问作者user2264738
相关产品推荐
相关产品推荐

