【问题标题】:Python requests: Passing multiple client certificates to session.certPython 请求:将多个客户端证书传递给 session.cert
【发布时间】:2019-10-08 12:07:50
【问题描述】:

我正在编写一个连接到使用 TLS v1.2 的外部肥皂服务的 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 个证书的捆绑包,我也会收到错误消息(就像您在 session.verify 中使用 CA 证书一样)。我可以在 Wireshark 上看到只有第一个用于 TLS 连接。

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

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

【问题讨论】:

  • 从文档看来,唯一可行的方法似乎是为 3 个证书使用单个文件,但如果这不起作用,则可能不受支持。考虑在requests issue tracker 上打开一个问题。
  • client_cert.pem中的顺序应该是叶子+链证书。不应该给出根证书。这种方式非常适合我。

标签: python session ssl python-requests


【解决方案1】:

我知道了!

我安装了一些旧版库版本。

这个问题似乎是 1.23 版中的fixed by requests library developers。我还必须更新 urllib3。

我目前的 requirements.txt 是:

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

按照规范,一切正常。我已经检查了 Wireshark 上的 TLS 连接。 “client_cert.pem”链中的所有证书都通过了。

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

谢谢你们!

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2021-05-31
    • 2021-01-21
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多