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

问题描述 投票:0回答:1

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

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

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

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

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

这是正确的吗?如果可以的话,c# 如何处理这个问题?

c# https proxy
1个回答
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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.