记录 Java 应用程序的所有网络交互

2022-09-01 15:16:37

我有一个可怕的Java应用程序(鲜为人知的应用程序服务器GNUEnterprise的客户端)及其源代码,在对其进行一些更改后,我可以将其编译回来。该应用程序大量使用网络,我需要监视每个请求和响应。我可以使用像Wireshark这样的嗅探器,但是该应用程序通过SSL与其服务器一起工作,因此不知道SSL证书的私钥任何嗅探的流量都是毫无用处的。

如何使每个请求和响应都从应用程序本身记录下来?我需要查看所有已发送和已接收的标头。我不想改变所有负责网络交互的代码。我想要的是像这样放一个代码

Network.setDefaultLogger(myCustomLoggerInstance);

在应用程序启动附近的某个地方,然后在执行我需要的所有日志记录中。myCustomLoggerInstance

此外,假设所有网络操作都是用s进行的,我可以用.但是为什么饼干不存在呢?如何以相同的方式转储发送和接收的cookie?URLConnectioncon.getHeaderFields()con.getRequestProperties()

编辑:我试图达到的是模仿RPC应用程序通过SSL与其服务器的通信,例如,使用.为此,我需要获取应用程序网络流量的详细日志。curl


答案 1

记录所有 SSL 流量的一种快速方法是使用以下命令启动 java:

-Djavax.net.debug=all

或者将其设置为系统属性:

System.setProperty("javax.net.debug","all");

振作。如果你这样做,标准会很吵!

(*注意:仅记录 SSL 流量和 SSL 调试信息(握手等)。不记录常规套接字。


答案 2

您不能使用日志记录代理服务器,例如 http://www.charlesproxy.com/http://fiddler2.com/?Charles Proxy还可以解码AMF请求,Fiddler是SSL拦截的冠军。

IIRC 您可以将系统属性 http.proxyHost 和 http.proxyPort 设置为 127.0.0.1 和 8888,java URLConnections 将通过您的日志记录代理服务器自动连接,您可以很好地查看 HTTP 流量。

或者,如果目的是能够重放通信,请使用JMeter HTTP代理,此记录的格式适合重放。它还具有对处理cookie的内置支持。

如果应用程序使用不错的 Web 服务,SoapUI 还具有一个监视代理,该代理可拦截已为其导入 WSDL 的 Web 服务调用。