在密钥/证书不匹配的情况下测试TLS证书身份验证

时间:2017-03-24 15:39:58

标签: python ssl https certificate client-certificates

我有一个使用TLS客户端证书进行用户身份验证的Web服务。现在我想写一个全栈测试,如果服务实现("配置为")正确的证书认证。

特别是我想知道是否可以使用与提供的客户端证书不匹配的密钥加密请求。

理想情况下,测试将使用Python编写,但任何其他常用语言也都可以。

所以我的第一次尝试是使用Python的requests包:

requests.post(url, data=payload, cert=(cert_path, key_path), verify=False)

如果密钥与证书匹配,则可以使用,但如果不匹配,我只需

requests.exceptions.SSLError: [X509: KEY_VALUES_MISMATCH] key values mismatch (_ssl.c:2718)

这是客户端错误,因此请求永远不会到达服务器(因此不会测试任何内容)。

所以我的问题是:实际上是否可能提供错误的证书,或者协议设计是不可能的?任何提示如何实施这样的测试?

2 个答案:

答案 0 :(得分:2)

在TLS协议中,可以发送CertificateVerify消息,其中包含的签名与客户端发送的证书不匹配。因此,它不会被协议设计排除,因此该签名的目的是证明客户端可以访问与发送的证书匹配的私钥,因此不可能将其排除在外。

但是,通过使用requests,您正在进行非常高水平的测试,这实际上是为了保护您免受典型错误的影响。如果您想使用无效签名等进行测试,则需要在较低级别工作,例如使用scapy构建自己的TLS握手。请注意,您需要更深入地了解TLS如何进行此类测试。

答案 1 :(得分:1)

假设您正在运行HTTPS,则基础SSL连接无法使用" bad"证书,如果您已将服务器配置为拒绝它们。

由于没有SSL连接,您无法传递任何类型的HTTP请求。

设计的重点 - 让不受欢迎的客户完全离开。