通过C#处理代理服务器中的HTTPS请求(CONNECT隧道)

时间:2014-06-05 08:17:00

标签: c# https proxy connect

我试图用C#编写一个家庭代理服务器,但我几乎成功了,但我处理HTTPS请求时遇到问题(CONNECT)。

我真的不知道如何处理这类请求。

在我的研究中,我意识到对于这个请求,我们必须直接将客户端连接到目标主机。

这些请求的步骤(我意识到):

  • 接收来自客户端的第一个请求(CONNECT https://www.example.ltd:443 HTTP / 1.1)并将其发送给目标主机
  • HTTP/1.1 200 Connection Established\r\n\r\n发送给客户
  • 同时收听套接字(客户端和目标主机)并将彼此之间的接收发送给对方
  • 侦听,直到其中一个套接字断开连接

这是对的吗?如果没问题,请用c#来处理这个问题?

1 个答案:

答案 0 :(得分:2)

我的理解是

CONNECT www.example.com:443 HTTP/1.1
来自浏览器的

要求您在端口443上建立到example.com的连接。一旦成功实现,您应该发送

HTTP/1.1 200 Connection established\r\n\r\n

回到浏览器的字符串。您不会像我认为的那样将CONNECT字符串发送到服务器。此外,这个初始连接不应该加密。

从这一点开始,浏览器和终端服务器将通过纯文本连接交换数据,您必须将其转发到正确的目的地。为此,套接字必须保持打开状态。但是,没有指定通信顺序,因此不要依赖浏览器发送数据,然后是服务器的响应。可以随时发送数据。他们将首先建立自己的安全连接,然后开始执行通常的http请求。

希望这有帮助。

参考文献:

https://stackoverflow.com/a/24195792/1224132

http://tools.ietf.org/html/draft-luotonen-ssl-tunneling-03

http://www.ietf.org/rfc/rfc2817.txt