调用私有HTTPS API时Python Requests忽略SSL报错问题求助
解决Python Requests调用私有HTTPS API的SSL连接问题
问题分析
你遇到的ConnectionError: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))错误,核心原因是SSL协议版本不兼容——目标API依赖旧版SSL/TLS协议(如TLS1.0、TLS1.1甚至SSL3),而Python Requests默认配置不支持这些旧版本;Windows环境下Python的SSL库路径异常也可能触发该报错。
已知PowerShell通过强制启用多版本SSL/TLS可正常访问,wget也能忽略证书验证成功请求,说明问题本质是Requests的SSL协议支持范围与目标API不匹配。
解决方案
方法1:强制指定兼容的SSL协议版本
自定义HTTP适配器,让Requests使用和PowerShell一致的SSL/TLS协议范围,覆盖默认配置:
import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager import ssl from urllib3.exceptions import InsecureRequestWarning # 关闭不安全请求警告(可选,避免verify=False触发的提示) requests.packages.urllib3.disable_warnings(InsecureRequestWarning) class MultiSSLAdapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): # 启用OpenSSL支持的所有TLS版本,和PowerShell配置对齐 self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLS ) # 初始化会话并挂载适配器 session = requests.Session() session.mount("https://", MultiSSLAdapter()) # 发起请求 url = "https://10.17.64.102:8085/?StationList" response = session.get(url, verify=False) # 输出返回结果 print(response.text)
如果ssl.PROTOCOL_TLS无效,可直接指定目标API支持的具体版本:
ssl.PROTOCOL_TLSv1(对应TLS1.0)ssl.PROTOCOL_TLSv1_1(对应TLS1.1)ssl.PROTOCOL_TLSv1_2(对应TLS1.2)
方法2:修复Windows环境SSL库路径问题
若上述方法无效,可能是Python安装时缺失SSL组件或系统找不到SSL动态库:
- 重新安装Python,确保勾选Add Python to PATH选项;
- 检查系统
PATH环境变量是否包含Python安装目录下的DLLs文件夹(如C:\Users\mdr\AppData\Local\Programs\Python\Python310\DLLs),该目录包含libssl-1_1-x64.dll等关键文件; - 仍有问题可从OpenSSL官网下载对应版本库文件,放入Python的
DLLs目录或系统System32目录。
辅助排查:验证curl协议兼容性
先通过curl指定协议版本测试,确认目标API支持的SSL版本:
curl --insecure --tlsv1.2 https://10.17.64.102:8085/?StationList
若该命令能正常返回结果,说明目标API支持TLS1.2,此时在Python代码中指定ssl.PROTOCOL_TLSv1_2即可解决问题。
内容的提问来源于stack exchange,提问作者clouvis
相关产品推荐
相关产品推荐

