使用 Wireshark 之类的工具,可以通过记录(预)主密钥来作为客户端解密 SSL 流量,而无需使用中间人攻击或服务器的私钥。但是我发现对于某些网站,ssl session id 正在由服务器存储(证据:ServerHello 消息包含重用的 session id),并且(我相信)这可以防止发生完整的 ssl 握手,从而防止了 wireshark从成功解密。诚然,我不完全确定这是问题所在,但证据非常有说服力。客户端有什么方法可以防止重复使用 ssl 会话 ID?
是否可以强制新的 SSL 会话
在 SSL 中,只有当客户端和服务器都记住“握手参数”(特别是协商的预主密钥)时,客户端和服务器才可以进行简短的握手。“会话 ID”是客户端和服务器宣传他们的记忆的方式:客户端发送ClientHello
前一个会话 ID 的副本,服务器将其发回以确认该会话将被重用。
在不破坏后续加密操作的情况下,您无法从客户端消息中删除会话 ID,因为Finished
握手结束时的消息是作为所有先前交换的握手消息的哈希值计算的,其中包括ClientHello
. 因此,客户端和服务器必须“看到”相同的ClientHello
. (但是,请参见下文。)
因此,为了防止简短的握手,您必须强制健忘。SSL 服务器可以配置为不记住超出某些不活动超时的会话;例如,请参阅 Apachemod_ssl
指令SSLSessionCache和SSLSessionCacheTimeout。关闭并重新启动服务器也可能刷新缓存,只要缓存保留在 RAM 中(对于多前端服务器,缓存可能与公共数据库或类似的东西共享,在这种情况下,缓存清除可能会更复杂)。
在客户端,SSL 会话通常保存在 RAM 中。例如,Internet Explorer 在内部由多个相互通信的进程组成,您必须将它们全部杀死才能使其忘记 SSL 会话(实际上,这仅在您关闭所有IE 窗口时才会发生)。
但是,您的报价很奇怪:
使用 Wireshark 之类的工具,可以通过记录(预)主密钥来作为客户端解密 SSL 流量,而无需使用中间人攻击或服务器的私钥。
Wireshark无法做到这一点。Wireshark 检查传输中的数据包,如果没有服务器私钥的副本,您无法从这些数据包中推断出预主密钥。这就是 SSL 的全部意义:防止窃听者能够理解交换的数据。为了能够从“网络拦截器”的角度闯入 SSL 会话,您必须进行中间人攻击,并进行双重模拟;这可能只有在您绕过证书安全模型时才会发生:您必须说服人类用户(SSL 客户端)安装伪造的流氓根 CA 密钥,或者“点击”浏览器显示的红色和可怕的警告。注意到所谓的服务器证书很时髦。
如果您可以“记录 pre-master secret”,那么这意味着您有权访问客户端或服务器的 RAM 内容;该访问不会使用 Wireshark,而是使用调试器。Wireshark 提供的是使用一些捕获的预主密钥的可能性(例如,请参阅此页面);有了这些信息,Wireshark 将能够解密数据。但是,它不会(也不能)自己进行捕获:这需要直接访问客户端或服务器 RAM,或者修改后的客户端或服务器来泄漏信息。打个比方,你不能通过电话进行脑部手术。
如果您确实对客户端(或服务器)具有类似调试器的访问权限,那么您应该能够操纵客户端(分别为服务器)以使其“忘记”先前的 SSL 会话,从而强制进行新的完整握手。
例如,如果您使用的是 IE 之类的浏览器,您可以清除缓存和 SSL 缓存,这将迫使它再次完成整个过程。