客户端证书在curl中工作,但在Python中不工作

客户端证书在curl中工作,但在Python中不工作,python,ssl,curl,python-requests,Python,Ssl,Curl,Python Requests,使用curl,我可以连接到需要特定证书的服务器 curl -E ./file.crt.pem --key ./file.key.pem -k https://server.url curl版本:7.29.0 但在使用Python的请求库时,我得到一个错误: import requests cert_file_path = "file.crt.pem" key_file_path = "file.key.pem" cert = (cert_file_path, key_file_path) ur

使用curl,我可以连接到需要特定证书的服务器

curl -E ./file.crt.pem --key ./file.key.pem -k https://server.url
curl版本:7.29.0

但在使用Python的请求库时,我得到一个错误:

import requests
cert_file_path = "file.crt.pem"
key_file_path = "file.key.pem"
cert = (cert_file_path, key_file_path)
url = 'https://server.url'
r = requests.post(url, cert=cert, verify=False)
错误:

SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_read_bytes', 'tlsv1 alert unknown ca')])"))
Python版本:v3.7

我遗漏了什么?

一条评论帮助我找到了答案

按如下方式更新您的代码:

导入请求
cert\u file\u path=“file.crt.pem”
key\u file\u path=“file.key.pem”
证书=(证书文件路径、密钥文件路径)
url='1〕https://server.url'
r=requests.post(url,cert=cert,verify=“path/to/ca_public_keys.pem”)#替换为您的文件
我假设您使用的是自签名证书,因此需要指定
.pem
文件,其中包含颁发自签名证书的CA的公共证书确保包含中间证书,否则请求库将抛出
tlsv1警报未知ca
错误


您可以在终端中键入
openssl x509-noout-in file.crt.pem-issuer
来检查客户端证书的颁发者。

请求模块检查环境变量请求\u CA\u BUNDLE中的证书文件。所以就这么做吧

export REQUESTS_CA_BUNDLE=/absolute/path/to/your/file.crt.pem
您的python代码将是:

import requests

url = 'https://server.url'
r = requests.post(url)
print(r.text)

很可能是因为Python不使用系统信任证书存储。试试这个问题:@RobertKearns我在那里尝试了解决方案,但没有一个奏效。我也试过在golang,握手失败。我最终为curl绑定编写了一个库。。。