实现HTTPS网站的数据包捕获

时间:2015-02-21 13:49:43

标签: java sockets curl socket.io serversocket

我使用java IO API实现了一个数据包捕获工具。我已将端口设置为8081.问题是,当我尝试访问https网站时,此类响应无法在我的程序中捕获。我正在开发一个示例应用程序来演示流量整形。根据我的知识端口8080和8081不支持https请求,但是当我将端口设置为下面的代码片段时,代码会抛出错误。

ServerSocket serverSocket = null;         boolean listening = true;

    int port = 8081;    //default

    try {
        serverSocket = new ServerSocket(port);
        System.out.println("Started on: " + port);
    } catch (IOException e) {
        System.err.println("Could not listen on port: " + port);
        System.exit(-1);
    }

下面的snipet是我尝试捕获响应数据包并获取已读取数据包的计数。 HTTP会被计算,但HTTPS请求不会

 URL oracle = new URL(urlToCall);
            URLConnection yc = oracle.openConnection();
            is = yc.getInputStream();


            final byte[] buffer = new byte[BUFFER_SIZE]; // 1kb

            int index = is.read(buffer, 0, BUFFER_SIZE); // insert first packet
            int i = 0;
            while (index != -1)

知道如何解决这个问题吗? 谢谢

1 个答案:

答案 0 :(得分:0)

我认为这里真正的问题是你要以错误的方式进行数据包捕获。 (或许你的意思是通过数据包捕获与其他人的意思不同。)

在真正的数据包捕获应用程序中,目标是让您的应用程序捕获现有客户端和服务器之间的数据包。

但是你的程序正在创建/绑定ServerSocket ...可能是为了让它接受连接。这意味着您的程序将是服务器/服务。它不会拦截客户端和其他服务器之间的流量。

在java中实现数据包捕获的常规方法是使用jpcap库。


如果new ServerSocket(port)失败,则很可能某个其他应用程序已绑定到该端口。很可能是你试图服务的服务器" snoop"上。如果你打印了堆栈跟踪,我希望它会证实这一点。