通过c#(连接隧道)处理代理服务器中的HTTPS请求

本文关键字:代理服务器 HTTPS 请求 处理 连接 隧道 通过 | 更新日期: 2023-09-27 18:06:45

我正在尝试用c#编写一个家庭代理服务器,我几乎成功了,但我有问题处理HTTPS请求(CONNECT)。

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

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

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

  • 接收来自客户端的第一个请求(CONNECT https://www.example.ltd:443 HTTP/1.1)并将其发送到目标主机
  • 发送HTTP/1.1 200 Connection Established'r'n'r'n到客户端
  • 监听两个套接字(客户端和目标主机)并相互发送接收
  • 监听直到其中一个套接字断开

正确吗?

通过c#(连接隧道)处理代理服务器中的HTTPS请求

我的理解是

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

https://datatracker.ietf.org/doc/html/draft-luotonen-ssl-tunneling-03

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