发送客户端证书如何避免客户端被冒充

Dee*_*ake 1 sockets authentication ssl certificate mutual-authentication

好吧,为了方便沟通,我将参考这张图片TLS 相互认证的描述

好的,服务器发送一个公钥,客户端用它来加密自己的证书信息并发回服务器。我不明白的是为什么攻击者无法拦截步骤 4 中的数据包,然后使用它发送到服务器来冒充客户端。他们不必知道里面的信息或解密它。如果攻击者获得该数据包并保存它,那么当服务器请求客户端证书时,他们可以将这些确切的字节发送到服务器。我不确定这种加密方法如何防止此类攻击。话又说回来,当涉及到套接字级加密时,我完全是个菜鸟,所以我可能会错过一些重要的东西。谢谢!

Pat*_*zek 7

事情比这更复杂,这张图有一些缺陷,并且混合了本地存储的内容和交换的内容。

查看https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_handshake,特别是“客户端验证的 TLS 握手”案例。

总之:

  • 在某些时候,服务器要求客户端发送证书(这并不总是需要的,因此服务器会发送一条特定的消息来请求它,CertificateRequest
  • 然后客户端回复一条Certificate消息,其中包含其证书
  • 在此阶段,服务器已经可以根据所提供的证书决定是否要进一步进行;在那个阶段,其他人确实也可以发送相同的证书,因为它是公开的。但接下来的内容解释了为什么它在 TLS 握手中无法进一步工作
  • 在来自服务器的消息包含各种加密数据之后ClientKeyExchange,这些数据稍后将用于真正加密应用程序数据的交换,
  • 客户端发送一条消息,该消息是使用与客户端证书关联的私钥CertificateVerify握手之前的 TLS 消息交换中计算出的签名
  • 接收此消息的服务器可以仔细检查它是否正在与真正的客户端通信,因为通过尝试使用客户端公钥(包含在证书中)验证签名,它将知道远程方是否确实具有正确的关联私钥。

因此,只要私钥保持私有,攻击者就不能通过窃取证书来冒充客户端(在其他情况下也存在相同类型的保护,以对服务器进行身份验证)。如果私钥被盗,那么上述所有操作都会失败。

此时无需了解加密签名的所有细节,只需系统的设计方式是,由一个密钥加密的所有内容只能由另一个密钥解密:如果有人用其私钥加密数据,那么任何人都可以用其公钥(根据定义,公钥)对其进行解密;然后您通常会遇到传播它的问题,但这里不会,因为公钥包含在之前交换的证书中握手);当然,这对于保密性来说毫无用处(任何人都可以看到加密的内容),但它是身份验证的基础,因为如果解密有效,则意味着发送者拥有与您用来解密该内容的公共密钥相关的私钥。

请注意,对于刚刚作为新标准推出的 TLS 1.3,TLS 交换中的消息数量和性质略有变化,但上述加密保证(使用私钥签署某些内容,以便远程方可以仔细检查)相关的公钥)仍然有效。