curl可正常请求但Python requests调用报SSLError是什么原因?
问题触发原因及解决方案
curl可以正常执行说明服务端网络连通、证书本身有效性不存在问题,报错是Python侧的证书校验逻辑不通过导致,具体触发原因和解决方案如下:
触发原因
- CA证书格式不符合标准PEM规范
你提供的证书内容为---BEGIN CERTIFCATE---- SOMERANDOMSTRING ---END CERTIFICATE----,存在三处不符合标准的问题:
- 头部拼写错误:正确标识为
CERTIFICATE,你给出的内容少了字母I,写成了CERTIFCATE - 分隔符短横线数量错误:标准PEM格式的证书首尾分隔符为5个短横线,你给出的内容开头只有3个、结尾有4个,数量不匹配
- 内容排版错误:证书内容和首尾分隔符不能放在同一行,必须换行分隔
curl对PEM格式的容错性远高于Python底层的ssl模块,不规范的格式curl可以自动兼容解析,但Python ssl模块会直接判定证书无效,抛出校验失败错误。
- Python进程无证书文件读取权限
如果运行curl命令的用户和运行Python脚本的用户不是同一身份,Python进程可能没有/var/lib/myapp/server-ca.crt文件的读取权限,无法读取到有效证书内容也会触发校验失败。
解决方案
- 首先修正CA证书的PEM格式,调整后格式如下:
-----BEGIN CERTIFICATE----- SOMERANDOMSTRING -----END CERTIFICATE-----
- 给Python运行用户分配证书文件的可读权限,可执行以下命令:
chmod +r /var/lib/myapp/server-ca.crt
你也可以在Python代码中先增加读取测试,确认证书可以正常读取:
with open("/var/lib/myapp/server-ca.crt", "r") as f: print(f.read())
- 如果你需要临时测试确认问题根源,可以将
verify参数设置为False跳过证书校验(该配置存在安全风险,生产环境禁止使用):
response = requests.get(url=url, headers=headers, verify=False)
内容的提问来源于stack exchange,提问作者C--
相关产品推荐
相关产品推荐

