Java HTTPS连接转发

时间:2013-01-04 08:32:39

标签: java https network-programming socketexception

我在Java编写一个简单程序,接收来自浏览器(如Firefox)的连接请求,解析统计信息请求,然后将请求转发到原始目标。然后,程序从目标读取响应,解析响应以获取统计信息,然后将响应转发给浏览器。

此操作的伪代码如下:

// Accept connection from browser and read request
1. Socket browserConnection = serverSocket.accept();
2. browserConnection.getInputStream().read(buffer);
3. SocketInetAddress destInetAddress = parseHttpRequest(buffer);

// Connect to destination and forward request
4. Socket destConnection = new Socket(destInetAddress);
5. destConnection.getOutputStream().write(buffer);

// Read response from destination
6. destConnection.getInputStream().read(buffer);
7. parseHttpResponse(buffer);

// Forward response to browser
8. browserConnection.getOutputStream().write(buffer);

这适用于HTTP连接,但我得到connection reset用于HTTPS连接。

注意:我知道HTTP和HTTPS连接之间的区别,与HTTP不同,它不仅仅是一次send,还有一些receives。我的HTTPS reads代码尽可能多,并且writes尽可能多。

为什么我从任何HTTPS服务器(例如https://www.google.comhttps://www.comodo.com等)获得连接重置。我尝试连接?!

2 个答案:

答案 0 :(得分:0)

HTTPS受到保护,可防止发生中间人攻击。你所谈论的,无论是否合法,都是中间人攻击的样子。使用HTTPS,您不仅可以拦截另一个目的地的数据包并读取它们。但是,您可以将数据包定向到您,为客户端提供安全证书,对数据包进行解码,对数据包执行任何操作,对其进行重新编码,然后将其传递到另一个目标。不同的是,客户必须知道你的存在以及你是谁。否则,它将无法使用HTTPS与您通信。

答案 1 :(得分:0)

使用HTTPS代理,浏览器将为代理发送CONNECT命令,以建立到目标服务器的TCP连接(例如https://www.google.com)。代理建立连接后,它会向浏览器返回OK消息。然后,浏览器将启动与目标服务器的SSL握手,以启动加密数据传输。代理不得干扰数据。代理需要做的就是在浏览器和目标服务器之间传递字节流,就是这样。