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

Posted

技术标签:

【中文标题】Python请求-客户端证书的SSL错误【英文标题】:Python Requests - SSL error for client side cert 【发布时间】:2013-07-08 17:14:20 【问题描述】:

我在 python 中调用带有请求的 REST API,到目前为止,当我设置 verify=False 时已经成功。

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

r = requests.post(url, params=payload, headers=headers, 
                  data=payload, verify='cert.pfx')

这是我得到的错误:

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)

我也尝试过 openssl 获取 .pem 和密钥,但使用 .pem 并获取 SSL: CERTIFICATE_VERIFY_FAILED

有人可以指导我如何导入证书以及将其放置在哪里吗?我尝试搜索但仍然遇到同样的问题。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。 verify 参数是指服务器的证书。您希望 cert 参数指定您的客户端证书。

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)

【讨论】:

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

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

response = requests.post(url, data=your_data, cert=('path_client_certificate_file', 'path_certificate_key_file'), verify='path_rootCA')

【讨论】:

谢谢。事后看来,服务器需要我的根证书来验证 CA 证书是有道理的,但这是缺少的部分。

以上是关于Python请求-客户端证书的SSL错误的主要内容,如果未能解决你的问题,请参考以下文章

禁用SSL证书检查双绞线代理

在 SSL WebSocket 连接 (wss) 中拦截请求

不支持SSL时对HTTPS请求进行规范处理

nginx和iis下的SSL双向认证教程【ca 自签 ssl证书】

Wininet SSL 与每个请求的客户端证书智能卡访问

Apache 不会请求我的 SSL 客户端证书