使用Requests调用Euronext REST API时遭遇OpenSSL.SSL.Error报错
我之前也碰到过类似的SSL握手问题——明明curl能正常跑,换成Requests就掉坑里了。结合你给出的错误信息(urllib3的pyopenssl模块握手失败),大概率是客户端证书配置或者服务器CA信任的细节没处理对,给你几个排查方向和解决方案:
排查与解决方案
1. 确认客户端证书的传递方式
curl对证书的处理比较灵活,但Requests有明确的要求:
- 如果你的客户端证书和私钥是分开的文件(比如
.crt和.key),必须把cert参数设为元组:cert=('你的客户端证书路径.crt', '你的私钥路径.key') - 如果是合并成一个PEM文件(证书+私钥都在一个文件里),直接传文件路径即可:
cert='合并后的证书.pem' - 要是私钥设置了密码,别忘了在元组里加上密码:
cert=('client.crt', 'client.key', '你的私钥密码')
2. 确保服务器证书被信任
默认情况下Requests会用系统的根证书库验证服务器证书,但Euronext的API可能用了自定义CA,这时候需要显式指定CA证书文件:
response = requests.get( 'https://saturn-api-h.euronext.com/你的接口路径', cert=('client.crt', 'client.key'), verify='euronext的CA证书路径.crt' # 替换成实际的CA证书文件 )
⚠️ 别轻易用verify=False跳过验证(虽然能快速排查问题,但生产环境绝对禁止,会有安全风险)。
3. 升级相关库版本
旧版本的Requests、urllib3或pyopenssl可能存在SSL握手的兼容性bug,尤其是在处理某些证书格式时。执行下面的命令升级到最新版:
pip install --upgrade requests urllib3 pyopenssl
4. 检查文件路径与权限
- 尽量用绝对路径指定证书文件,避免相对路径导致程序找不到文件(Windows下注意路径分隔符用
\\或者原始字符串r'path') - Windows下确保证书文件没有被系统权限限制,比如不要放在受保护的目录(如
C:\Windows)里。
5. 开启DEBUG日志排查细节
开启Requests的DEBUG日志,能看到SSL握手的完整过程,帮你定位到底是哪一步出问题:
import logging import requests # 开启DEBUG日志 logging.basicConfig(level=logging.DEBUG) # 发送请求 response = requests.get( 'https://saturn-api-h.euronext.com/你的接口路径', cert=('client.crt', 'client.key'), verify='ca.crt' )
查看日志里的SSL握手细节,比如是否提示“证书不受信任”“私钥不匹配”等具体错误。
对比curl命令验证参数
把你能用的curl命令贴出来对照,比如如果你的curl命令是:
curl --cert client.crt --key client.key --cacert ca.crt https://saturn-api-h.euronext.com/your-endpoint
那对应的Requests参数必须完全匹配——cert对应--cert和--key,verify对应--cacert,确保没有遗漏任何参数。
内容的提问来源于stack exchange,提问作者Jean-François Augé
相关产品推荐
相关产品推荐

