我正在编写一个连接到使用 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/