安全与安全验证客户端时的TLS握手

时间:2011-07-31 10:20:58

标签: security p2p ssl handshake

在使用客户端身份验证配置的TLS握手中,有一个步骤,服务器接收客户端的证书并选择信任它(例如,在Java中通过TrustManager完成)。

我想知道服务器的最终“信任失败”消息是在服务器确保客户端确实拥有该公钥之前或之后发送的(例如,通过接收来自编码的握手的一些消息)客户的私钥)。

我的问题的目的是看第三方是否有可能通过伪装成这个客户端并使用他的公钥来检查服务器是否信任客户端。

注意:在具有特定安全要求的上下文中使用TLS时,风险是真实的。例如,假设一个P2P应用程序在对等体之间使用TLS,并使用TrustManager作为从其联系人列表中验证对等体的方法。该联系人列表应该是私人的。 ISP可以列出节点与之通信的IP,然后通过与其开始TLS握手来获取其公共证书,然后他可以尝试连接IP列表上的每个其他节点。最后,ISP可以获得应该是私有的联系人列表的很大一部分。

2 个答案:

答案 0 :(得分:2)

这取决于实施。我们的实现立即发送错误,就像其他实现一样 - 我猜大多数都是这样做的。

然而无关紧要:如果证书无效,服务器会发送特定的错误代码(BadCertificate),因此无论何时发送此代码,攻击者都会知道证书已有没被接受。保护服务器免受此攻击需要服务器发送不同的错误代码,这会使合法客户端感到困惑。

检测到服务器是否接受证书的风险(或令人不快的后果)是有问题的。如果这对您很重要,您可以更改错误代码并构建您使用的OpenSSL或其他SSL服务器模块的自定义版本。

答案 1 :(得分:2)

OpenSSL也会在客户端证书消息中立即验证客户端证书。

但正如Eugene所说,如果服务器发送有意义的警报,那么您是立即发送bad_certificate还是仅在验证证书验证消息中的签名之后无关紧要。这只会阻止某人在另外发送格式错误的签名(例如,使用错误的密钥)时查明证书是否可信。但是,如果以这种方式实现服务器,您所要做的就是使用刚生成的私钥对您的证书验证消息进行签名。然后签名将有效,然后服务器将尽职地验证您发送的证书,并显示与以前相同的信息。

为了缓解这种情况,你真的必须使用一个根本不发送相应警报的自定义服务器,而是一些不那么透露的东西。