Python请求 - 客户端证书的SSL错误

onl*_*yme 13 python certificate python-requests

我在python中使用请求调用REST API,到目前为止我在设置时已成功verify=False.

现在,我必须使用我需要导入的客户端证书进行身份验证,每次我使用cert (.pfx). cert.pfx受密码保护时,我都会收到此错误.

r = requests.post(url, params=payload, headers=headers, 
                  data=payload, verify='cert.pfx')
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

Traceback (most recent call last):
File "C:\Users\me\Desktop\test.py", line 65, in <module>
r = requests.post(url, params=payload, headers=headers, data=payload, verify=cafile)
File "C:\Python33\lib\site-packages\requests\api.py", line 88, in post
return request('post', url, data=data, **kwargs)
File "C:\Python33\lib\site-packages\requests\api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Python33\lib\site-packages\requests\sessions.py", line 346, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python33\lib\site-packages\requests\sessions.py", line 449, in send
r = adapter.send(request, **kwargs)
File "C:\Python33\lib\site-packages\requests\adapters.py", line 322, in send
raise SSLError(e)
requests.exceptions.SSLError: unknown error (_ssl.c:2158)
Run Code Online (Sandbox Code Playgroud)

我也尝试过openssl来获取.pem和关键但是有了.pem并且得到了SSL: CERTIFICATE_VERIFY_FAILED

有人可以指导我如何导入证书以及在哪里放置证书?我尝试过搜索,但仍面临同样的问题.

bba*_*les 35

我有同样的问题.该verify参数似乎是指服务器的证书.您希望cert参数指定您的客户端证书.

我不得不使用OpenSSL转换来获取证书PEM文件和密钥PEM文件.

import requests
cert_file_path = "cert.pem"
key_file_path = "key.pem"

url = "https://example.com/resource"
params = {"param_1": "value_1", "param_2": "value_2"}
cert = (cert_file_path, key_file_path)
r = requests.get(url, params=params, cert=cert, verify=False)
Run Code Online (Sandbox Code Playgroud)

我仍然遇到问题,请求不能很好地与一些SSL服务器,但我认为verify/ cert区别可能是你的问题.

  • 非常感谢.抱歉没有回复,但似乎解决了这个问题!感谢您的回复. (3认同)
  • @ierdna .pfx 是 .p12 的同义词,它是 PKCS#12 格式,使用 OpenSSL 转换为 PEM 包含在 [this question](/sf/ask/1060083251/) (3认同)
  • 您是如何从.pfx中提取证书和密钥的? (2认同)
  • 在大多数情况下,您不应设置“ verify = False”,因为这会禁用服务器证书的验证,这会使整个连接不安全并且容易受到中间人攻击。如果要使用由知名CA颁发的证书连接到服务器,则完全不要指定“ verify”。如果您使用私有/自定义CA颁发的证书连接到服务器,则应将该CA证书的路径作为“ verify”参数的值传递(如果服务器的证书是自签名的,则对待服务器的证书证书与CA证书相同)。 (2认同)

小智 7

我遇到了同样的问题,为了解决这个问题,我知道我们必须发送 RootCA 以及证书及其密钥,如下所示,

response = requests.post(url, data=your_data, cert=('path_client_certificate_file', 'path_certificate_key_file'), verify='path_rootCA')
Run Code Online (Sandbox Code Playgroud)