1

我正在编写一个简单的程序,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等)都会重置连接?!

4

2 回答 2

0

HTTPS 是安全的,以防止发生中间人攻击。您所说的,无论是否合法,都是中间人攻击的样子。使用 HTTPS,您不能只拦截发往另一个目的地的数据包并读取它们。但是,您可以让数据包指向您,向客户端提供您的安全证书,对数据包进行解码,对它们做任何您想做的事情,对它们重新编码,然后将它们传递到另一个目的地。不同之处在于,客户必须知道你的存在以及你是谁。否则,它将无法使用 HTTPS 与您通信。

于 2013-03-14T18:06:27.660 回答
0

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

于 2013-10-08T12:46:41.477 回答