为 python 个 HTTPS 请求禁用客户端身份验证

Disable Client Authentication for python HTTPS requests

目前我的客户端 HTTPS 请求代码如下所示:

resp = requests.post(endpoint_predict_v100, files={'image': open(file_path, 'rb')}, verify=client_auth,
                         cert=(client_cert_path, client_secret_path))

这是一个 HTTPS 请求,服务器根 CA 是 client_auth,客户端证书和密钥是 client_cert_pathclient_secret_path

因为我的服务器代码已经部署,我不能在这方面做太多改变,我想知道我是否可以在客户端执行以下操作:

  1. 仅在客户端提供服务器根CA时启用服务器身份验证

  2. 仅当客户端提供客户端证书和密钥时才启用客户端身份验证。

我发现我可以做第一件事,“仅当客户端提供服务器根 CA 时才启用服务器身份验证”,如果服务器根 CA 不是,则传递 verify=False呈现在客户端,参考Python requests docs。但是,当我尝试删除 cert=(client_cert_path, client_secret_path) 时,请求将失败,并抛出此错误:

ssl.SSLError: [SSL] tlsv13 alert certificate required (_ssl.c:2570)

看来这个错误提示我必须传入客户端证书和密钥才能使服务器接受我的请求。但是当客户端证书和密钥不存在时,有没有办法在客户端禁用客户端身份验证?

ssl.SSLError: [SSL] tlsv13 alert certificate required (_ssl.c:2570)

... is there a way to disable client authentication on the client side, when the client cert and key are not present?

您收到的警报是因为服务器需要客户端证书。由于服务器需要它,因此仅更改某些客户端行为是不够的。这类似于服务器请求通过密码进行身份验证 - 这也不能在客户端中简单地跳过。

对于许多服务器,有一种方法可以让客户端证书可选,即请求客户端证书但不要坚持发送。但是,如何使用您的特定服务器执行此操作以及您的服务器是否完全支持它是未知的。