浏览器发送CONNECT请求后,创建代理无法正确通过SSL?

时间:2011-08-07 19:54:14

标签: java http sockets ssl

我已经困扰了一段时间,试图让我的自定义代理在浏览器发送CONNECT请求时正确处理。为了简单起见,让我解释一下我是如何处理这个过程的。也许在那时,有人可以帮助澄清我做错了什么。

  1. 在端口8080上使用ServerSocketChannel创建服务器。
  2. 将ServerSocketChannel绑定到Selector,当服务器等待来自端口8080的请求时,该Selector基本上允许非阻塞。
  3. 只要我将浏览器设置为端口8080并发送请求https://google.com,它就会通知选择器发送到端口8080的内容。
  4. 我得到了那个请求并看到它的CONNECT所以我立即创建了一个响应“建立连接”(我发送和接收的请求和响应在下面)
  5. 来自浏览器的请求:

    CONNECT google.com:443 HTTP / 1.1 User-Agent:Mozilla / 5.0(Windows; U; Windows NT 6.1; en-US; rv:1.9.2.18)Gecko / 20110614 Firefox / 3.6.18 GTB7.1 代理连接:保持活着 主持人:google.com

    响应我通过普通套接字发送回浏览器:

    建立HTTP / 1.1 200连接\ r \ nProxy-connection:保持活动\ r \ n \ r \ n

    1. 现在我等待从浏览器发送的东西,我假设此时会发送一个SSL请求但是没有任何东西被发送。我开始认为它是因为我没有与浏览器建立SSL握手,所以它不会通过默认创建的套接字发送SSL消息。您认为我需要通过端口8080关闭该套接字并在我将连接建立的响应发送回浏览器之前在端口8080上建立新的SecureSocket吗?这是我的下一步。我知道浏览器需要在初始CONNECT之后向我发送更多数据。我没有足够的数据只有CONNECT才能进入服务器。我想它不需要向我发送另外一个类似SSL中的以下请求:
    2. 获取/ 主持人:google.com

      一旦我得到类似的东西,我就可以与服务器建立我的安全套接字连接,并取回响应以发送回浏览器。

      您认为正确的方向是什么?只是在我发送连接后我没有收到任何其他消息。

1 个答案:

答案 0 :(得分:7)

  

我得到了那个请求并看到它的CONNECT所以我立即创建了一个   响应“建立连接”

一开始就错了。在 建立上游连接之前,不应发送“已建立连接”。你骗你的客户!

  

我开始考虑它,因为我还没有建立SSL   与浏览器握手

无关。完成后,就您而言,您将从客户端获得的下一件事是二进制。从这一点开始你应该做的就是复制字节。

  

你认为我需要通过端口8080关闭该套接字并建立   端口8080上的新SecureSocket

没有

  

一旦我得到类似的东西,我就可以建立我的安全   与服务器的套接字连接

错误。从客户端获取一些数据后,您应该通过与上游服务器的现有纯文本连接透明地发送数据。您不必亲自参与SSL。

  

我没有足够的数据只有CONNECT才能进入服务器。

是的,你这样做。当你被告知时,你应该建立上游连接,并告诉客户你已经这样做了,而不是之前。

  

您认为正确的方向是什么?

没有

  

只是在发送连接后我没有收到任何其他消息。

这表明你还没有发送过任何东西。 NIO代码很棘手。 write()API的返回代码是什么?