![如何防止中间人获取 SSL/TLS 密钥?](https://linux22.com/image/1514087/%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%E4%B8%AD%E9%97%B4%E4%BA%BA%E8%8E%B7%E5%8F%96%20SSL%2FTLS%20%E5%AF%86%E9%92%A5%EF%BC%9F.png)
据我了解,使用 HTTPS 而不是 HTTP 的主要原因是通信是加密的,因此任何监听的人都无法查看客户端/服务器之间 HTTP 交换的纯文本。
现在,在会话开始时,客户端和服务器根据 SSL/TLS 握手期间获得的信息商定一个主密钥。但是,如何才能阻止窃听者使用客户端/服务器商定的相同密码套件获取密钥呢?
如果没有什么可以阻止这种情况,那么 HTTPS 实际上怎么会比 HTTP 安全那么多呢? MITM 所需要做的就是使用从握手中获取的信息自己设计密钥,并使用它来解密客户端和服务器之间的通信。
我肯定错过了什么...
答案1
仅限客户端和服务器同意一个密钥,他们实际上从来没有以明文形式发送它。
最常见的,DH 密钥交换(2) 或其 ECDH 变体 – 每个对等体仅将其 DH 私钥与另一个对等体的 DH 公钥相结合,并且两者都获得相同的结果。如果你观察流量,你只会看到两个对等体的公钥,这是不够来导出最终的会话密钥。(TLS 握手稍后会验证攻击者没有注入自己的公钥。)
另一种方法(现在很少见)是“静态 RSA”——在这种模式下,客户端自行生成会话密钥,并且加密使用服务器的公钥(从 SSL 证书中获取)来验证。尽管密钥是通过网络发送,只有服务器能够解密。
(虽然“静态 RSA”方法可能更简单,但它的安全性也较低——获取证书的私钥将允许人们解密所有新旧 HTTPS 会话;换句话说,没有前向保密。它还要求证书具有能够加密/解密的密钥对,而 DH 样式的密钥派生只需要签名/验证。)