我正在尝试使用其他人编写的GUI Java程序,这种程序不像我期望的那样。在程序运行过程中,它与服务器联系以提取数据,但它没有显示正确的数据。我正在尝试确定我遇到的问题是否与网络相关 - 即正确的位从未进入客户端。
查看Java程序的源代码,它似乎使用HttpsURLConnection类通过SSL从服务器提取数据。我希望能够做的是使用Wireshark检查线路上发生的事情。我的理解是,如果你有相关的密钥,Wireshark支持解密一些SSL流量。我不控制服务器,因此无法访问其私钥。但是我控制程序运行的客户端。我的问题是,在实际中我如何配置wireshark来解密我刚才描述的场景的SSL流量?是否有一个特定的密钥HttpsURLConnection使用我可以添加到Wireshark?还有别的吗?
我应该注意到我已经考虑过简单地将日志记录添加到Java代码库中,但最终会更喜欢数据包捕获的基本事实而不是日志记录,因为我可能会错过/忽略在记录代码库时重要的事情。完全明白。
答案 0 :(得分:5)
由于您无法访问服务器私钥,因此Wireshark不能直接用于解密。
即使使用私钥,如果使用具有完全前向保密(PFS)的密码,Wireshark也无法解密流量。
您需要的是一个Man-in-The-Middle代理,从您的应用程序的角度来看,它就像一个SSL服务器,从服务器的角度来看,它就像客户端一样。
许多可以作为代理运行的程序,例如{。3}在.Net / Windows,Fiddler或Webscarab(Java)上。对于所有这些程序,您需要导出其使用过的服务器证书并将其作为可信证书添加到您的程序中,例如通过在命令行上指定一个合适的信任库来启动你的应用程序(参见Java属性javax.net.ssl.trustStrore
)。
答案 1 :(得分:1)
您可以使用extract-ssl-secrets工具从任何Java应用程序中提取Wireshark所需的密钥。
-javaagent:<absolute path to>/extract-ssl-secrets-1.0.0.jar=/tmp/secrets.log"
添加到应用程序的VM选项中。wireshark -o ssl.keylog_file:/tmp/secrets.log
如果它不能立即使用,请参见troubleshooting section。