如何用Python requests发HTTPS POST,忽略证书或传校验参数解决报错
解决方案
- 强制指定匹配的TLS版本
绝大多数生产环境HTTPS接口已禁用TLS1.0/1.1等低版本协议,requests默认的SSL协商逻辑如果未能匹配到服务器支持的高版本TLS,就会触发SSLEOFError。可通过自定义HTTP适配器显式指定使用TLS1.2及以上版本发起请求,示例代码如下:
import requests from requests.adapters import HTTPAdapter import ssl class TLSAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): context = ssl.create_default_context() # 可根据服务器要求调整最低支持的TLS版本,如TLSv1_3 context.minimum_version = ssl.TLSVersion.TLSv1_2 kwargs['ssl_context'] = context return super().init_poolmanager(*args, **kwargs) # 注意删除URL末尾多余的问号 url = "https://tamcmdb.tivit.com/mctwpsapi/v1/api/new" payload={} files={} headers = {} s = requests.Session() s.mount("https://", TLSAdapter()) # trust_env=False禁止读取系统代理配置,解决关闭证书校验后的FileNotFoundError问题 response = s.request("POST", url, headers=headers, data=payload, files=files, verify=False, trust_env=False) print(response.text)
- 显式配置代理规则
关闭证书校验后出现的FileNotFoundError报错,Windows环境下大概率是requests读取了系统代理配置但无法适配导致的:比如系统使用PAC自动代理脚本、代理地址格式异常等,Postman和PowerShell对系统代理兼容性更好因此运行正常。如果确实需要走代理,可显式传入proxies参数:
proxies = { "http": "http://替换为你的代理地址:端口", "https": "http://替换为你的代理地址:端口" } response = s.request("POST", url, headers=headers, data=payload, files=files, verify=False, proxies=proxies)
- 升级依赖库版本
低版本的requests、urllib3存在已知的SSL兼容问题,可尝试升级依赖后再测试:
pip install --upgrade requests urllib3
内容的提问来源于stack exchange,提问作者Isaias Pereira Machado
相关产品推荐
相关产品推荐

