【问题标题】:Java HTTPS Connection ForwardingJava HTTPS 连接转发
【发布时间】:2013-01-04 08:32:38
【问题描述】:

我正在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 代码 readswrites 一样多。

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

【问题讨论】:

    标签: java https network-programming socketexception


    【解决方案1】:

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

    【讨论】:

    • 这个答案被标记为解决方案,但经过更多实验,结果证明它具有误导性,所以恐怕我必须删除标记......解决方案是不使用 SSL 套接字......稍后我会详细解释解决方案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 2016-09-20
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      相关资源
      最近更新 更多