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

ste*_*eve 2 java sockets ssl http

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

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

浏览器请求:

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代理连接: keep-alive主持人:google.com

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

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

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

GET/Host:google.com

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

你在正确的轨道上怎么想?只是在我发送连接后我没有收到任何其他消息.

use*_*421 7

我得到了那个请求并看到它的CONNECT所以我立即创建了一个响应"Connection Established"

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

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

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

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

没有.

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

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

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

是的你是.当您被告知时,您应该形成上游连接,并告诉客户您已经实际执行此操作,而不是之前.

你在正确的轨道上怎么想?

没有.

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

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