SSL HandShake 中的客户端证书不安全?

信息安全 tls 验证 证书
2021-08-14 11:12:24

想象一下,我们有一个应用程序正在尝试使用 SSL 建立与服务器的安全连接。现在我们希望用户使用他存储在安全密钥库中的客户端证书来验证自己。

因此,如果我正确阅读了本规范,则服务器在握手协议期间发送其证书,并且能够通过证书请求从客户端请求证书(如果有必要的话)。现在用户将他的证书发送到服务器,就像服务器之前所做的那样,这意味着明文,因为还没有交换密钥。

我现在没有得到的是,如果客户端证书以明文形式发送并且证书未绑定到特定设备并且其证书中的客户端公钥不用于生成用于加密的对称密钥稍后,假设攻击者与受害者位于同一个无线局域网中,为什么攻击者无法嗅探客户端和服务器之间的握手协议?这样他就可以看到客户证书,复制它并自己使用它。

那么如何预防这种情况呢?由于攻击者没有签名证书的私钥,因此攻击者当然无法更改证书的某些数据,但是复制证书以窃取他的受害者身份还不够吗?我在这里想念什么?证书到底是绑定到设备上的吗?但我认为它不会,因为它只包含一些关于客户本人和他的公钥的信息。

我认为在交换对称密钥并加密应用程序数据时,在握手协议之后发送客户端证书会是一个更好的主意。我知道您还可以使用其他用户凭据,例如用户名和密码,但我现在只是在谈论客户端证书的安全性。

所以你怎么看?

4个回答

证书仅包含公钥——即公共数据。重要的部分不是Certificate客户端发送的消息,而是CertificateVerify客户端也发送的消息。该消息包含客户端使用他的私钥计算的数字签名,以及之前的握手消息。攻击者可以嗅探他想要的一切,他将无法获得未发送的私钥,并且他将无法计算另一个签名,适用于另一个 SSL 交换。

即使客户端证书可见,也无法伪造使用私钥进行的签名。以前的答案给出了有关消息的更多详细Certificate Verify信息,但公钥/私钥原则与服务器证书(或一般的非对称加密机制)相同:如果您没有私钥,则无法模拟实体颁发证书的对象。

客户端证书身份验证的第二个问题是,如果它是在初始握手期间完成的,那么窃听者可以清楚地看到证书本身。在某些情况下,这可能并不令人满意,因为这可能会泄露用户的身份(例如CN=Bob Smith)。

缓解这种情况的一种方法是仅在重新协商的握手中使用客户端身份验证。

客户端将使用他们的私钥签署他们的消息,该私钥可以使用与客户端相对应的公开共享和信任的公钥解密。由于服务器可以使用客户端的公钥解密此信息,因此它知道该信息来自客户端。如果下一步协商是 RSA,则数据包的内容是用服务器的公钥加密的密钥的一部分,因此只有服务器可以解密第二级加密。

对于获取证书并试图劫持会话的流氓用户,服务器拥有用户的公钥,攻击者将无法生成将使用该公钥解密的信息,因此可以保证连接连接的发起者将继续是连接的客户端。

如果客户端证书未预先共享,则可以阻止与客户端形成会话,而是替换攻击者的公钥,但此时目标用户将不在会话中,也不会拥有密钥会议的信息。在初始握手后,与普通服务器证书 SSL 相同的 MITM 防护适用,提供客户端证书只是保证客户端身份在一个或多个会话中保持不变。

还有其他需要考虑的事情。为了非法获取客户的证书,您需要一个由证书颁发机构签名的证书——他们的工作就是证明您是谁。客户端应该只信任由信誉良好的 CA 签署的证书。