通过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
到客户端 - 监听两个套接字(客户端和目标主机)并相互发送接收
- 监听直到其中一个套接字断开
正确吗?
我的理解是
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