【发布时间】: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 个证书使用单个文件,但如果这不起作用,则可能不受支持。考虑在
requestsissue tracker 上打开一个问题。 -
client_cert.pem中的顺序应该是叶子+链证书。不应该给出根证书。这种方式非常适合我。
标签: python session ssl python-requests