解密由Java HttpsURLConnection生成的Wireshark中的客户端SSL流量



我正在尝试使用其他人编写的GUI Java程序,但该程序的行为并不像我预期的那样。在程序运行的过程中,它会联系服务器以获取数据,但没有显示正确的数据。我正在努力确定我遇到的问题是否与网络有关,即正确的比特永远不会到达客户端。

通过查看Java程序的源代码,它似乎使用HttpsURLConnection类通过SSL从服务器中提取数据。我想做的是使用Wireshark检查电线上发生了什么。我的理解是,如果你有相关的密钥,Wireshark支持解密一些SSL流量。我不控制服务器,因此无法访问其私钥。然而,我确实控制着程序运行的客户端。我的问题是,在实践中,我如何配置wireshark来解密我刚才描述的场景中的SSL流量?有没有一个我可以添加到Wireshark的HttpsURLConnection使用的特定密钥?还有别的东西吗?

我应该注意到,我曾考虑过简单地将日志记录添加到Java代码库中,但最终我更喜欢数据包捕获的基本事实,而不是日志记录,因为我可能会错过/忽略我不完全理解的代码库日志记录中的重要内容。

由于您没有访问服务器私钥的权限,Wireshark不能直接用于解密。

即使使用私钥,Wireshark也无法在使用完全前向保密(PFS)密码的情况下解密流量。

您需要的是一个中间人代理,从应用程序的角度来看,它就像SSL服务器,从服务器的角度来看它就像客户端一样工作。

有很多程序可以作为代理操作,例如Net/Windows上的Fiddler、Webscarab或BurpSuite(Java)。对于所有这些程序,您需要导出它们使用过的服务器证书,并将其作为可信证书添加到程序中,例如,在启动应用程序时,通过在命令行上指定合适的信任存储(请参阅Java属性javax.net.ssl.trustStrore)。

您可以使用提取ssl机密工具从任何Java应用程序中提取Wireshark所需的密钥。

  • 从本地下载jarhttps://repo1.maven.org/maven2/name/neykov/extract-ssl-secrets/1.0.0/extract-ssl-secrets-1.0.0.jar.确保文件名保持不变-extract-sl-secrets-1.0.0.jar
  • -javaagent:<absolute path to>/extract-ssl-secrets-1.0.0.jar=/tmp/secrets.log"添加到应用程序的VM选项中
  • 使用wireshark -o ssl.keylog_file:/tmp/secrets.log启动Wireshark
  • 开始捕获流量-应该立即解密

如果开箱即用不起作用,请参阅故障排除部分。

最新更新