带Bearer Token的HTTPS GET:cURL正常但Python requests请求失败
curl与Python requests SSL验证行为差异的原因
两者行为不同核心在于SSL证书信任机制的差异,具体分这几点:
证书信任源不一致
curl默认使用系统级根证书存储(比如Linux的/etc/ssl/certs、Windows系统证书库、macOS的Keychain),如果你的自签名证书已经被添加到系统信任列表中,curl会自动认可该证书的合法性。
而Python的requests库默认依赖certifi包提供的独立CA证书集合,这个集合和系统的证书存储完全分离,除非你手动配置,否则它不会识别系统中已添加的自签名证书,因此会抛出SSLCertVerificationError。证书验证的严格度与兼容性不同
部分版本的curl对证书链的兼容性更好:比如服务器返回的证书链顺序不符合标准,或者链中包含已被系统信任的自签名根CA时,curl会尝试兼容通过验证;而requests对证书链的验证更严格,只要certifi的CA集合中找不到对应的根证书,或者链顺序有问题,就直接报错。隐式配置差异
如果你没有给curl指定--cacert参数,它会自动读取系统CA;而requests的verify参数默认值为True,此时它只会加载certifi的CA包,不会主动读取系统CA。
补充:解决requests验证失败的方法
如果要让requests正常请求,有两种常用方式:
- 将自签名证书添加到
certifi的CA包中,或者在请求时指定证书路径:import requests response = requests.get( "https://my_website.com:443/api/storage", headers={"Authorization": "Bearer <TOKEN>"}, verify="/path/to/your/self-signed-cert.pem" ) - 临时关闭SSL验证(仅测试环境使用,生产环境禁止):
response = requests.get( "https://my_website.com:443/api/storage", headers={"Authorization": "Bearer <TOKEN>"}, verify=False )
内容的提问来源于stack exchange,提问作者Jean-Francois T.
相关产品推荐
相关产品推荐

