Python 请求 : Passing multiple client certificates to session. 证书

标签 python session ssl python-requests

我正在编写一个连接到使用 TLS v1.2 的外部 soap 服务的 Flask 应用程序。 我使用的是 Python 2.7 和版本 2.18.1 中的请求库。

我联系了服务器所有者,他告诉我我需要在 TLS 连接中包含多个客户端证书。这是我在单独的 .pem 文件中拥有的 3 个证书链。 (root + 中间 + 我的客户证书)。 如果我只想要最后一个,服务器不会让我进入。

我已经用 SoapUI 和 Wireshark 对此进行了测试,这是真的。只有当我提供整个 3 个证书链时,我才会收到回复。 仅传递我的客户端证书时,我从服务器收到错误消息。

来自 requests documentation您可以将其阅读为客户端证书,您可以使用以下方式仅通过一个证书:

session = requests.session()
session.cert = ('/path/client_cert.pem', '/path/private_key.pem')
response = session.post(SERVICE_URL, data=XML_CONTENT, headers=HEADERS)

即使我的“client_cert.pem”文件是 3 个证书的 bundle (就像您在 session.verify 中使用 CA 证书所做的那样),我也会收到错误消息。我可以在 Wireshark 上看到只有第一个用于 TLS 连接。

有没有办法在 Python 的请求库中包含多个证书 TLS 连接?

也许我应该使用不同的库或覆盖其中的一些代码?

最佳答案

我知道了!

我安装了一些旧版库。

看来这个问题是fixed by requests library developers在 1.23 版中。我还必须更新 urllib3。

我当前的 requirements.txt 是:

requests==2.22.0
urllib3==1.25.2 # compatible with requests 2.22

为了遵循规范,一切都完美无缺。我检查了 Wireshark 上的 TLS 连接。来自“client_cert.pem”链的所有证书均已通过。

如果你以后遇到这样的问题记得检查你的requests和urllib3库版本是否兼容。

谢谢大家!

关于Python 请求 : Passing multiple client certificates to session. 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58286050/

相关文章:

python - 从文本文件导入数据时向预先存在的字典键添加值 (Python 3)

Python OpenCV 将 mat ptr 传递给 C++ 代码

PHP - 在未提交的表单页面上正确销毁 session ?

php - 准确统计活跃用户? (PHP + MySQL)

node.js - 带有 nodejs 的谷歌计算引擎上的 SSL

python - 如何在 youtube API 中将我的视频上传到其他 channel

python: ctypes,在 python 中读取 POINTER(c_char)

php - 如何在 URL 中发送 PHPSESSID?

c# - 在 Rackspace (Mosso) Cloud 中托管时检查 SSL

ssl - 如何在 Tomcat 上为 HTTPS 配置 certbot 证书?