我有一个使用 TLS 客户端证书进行用户身份验证的 Web 服务。如果服务正确实现(“配置为执行”)证书身份验证,现在我想编写一个全栈测试。
特别是我想知道是否可以使用与提供的客户端证书不匹配的 key 来加密请求。
理想情况下,测试将使用 Python 编写,但任何其他通用语言也可以。
所以我的第一次尝试是使用 Python 的 requests
包:
requests.post(url, data=payload, cert=(cert_path, key_path), verify=False)
如果 key 与证书匹配,这会起作用,但如果不匹配,我就得到
requests.exceptions.SSLError: [X509: KEY_VALUES_MISMATCH] key values mismatch (_ssl.c:2718)
这是一个客户端错误,因此请求永远不会到达服务器(因此不会在那里测试任何东西)。
所以我的问题是:是否真的有可能出示错误的证书,或者协议(protocol)设计不可能这样做?有任何关于如何实现此类测试的提示吗?
最佳答案
在 TLS 协议(protocol)中,可以发送 CertificateVerify
消息,其中包含的签名与客户端发送的证书不匹配。因此协议(protocol)设计不会排除它,也不可能排除它,因为此签名的目的是证明客户端可以访问与发送的证书匹配的私钥。
但是,通过使用 requests
,您可以在非常高的级别上进行测试,这实际上是在尝试保护您免受典型错误的影响。如果您想使用无效签名等进行测试,您需要在较低级别工作,例如通过使用 scapy 构建您自己的 TLS 握手。 .请注意,您需要更深入地了解 TLS 如何进行此类测试。
关于python - 在 key /证书不匹配的情况下测试 TLS 证书身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43003685/