gpt4 book ai didi

c# - 如何通过http-header区分http和https

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:25 26 4
gpt4 key购买 nike

我正在用 C# 中的 TcpListener 编写代理。

此代理监听用户向其发送请求的端口。当接受用户请求时,它将解析请求 header 并找到主机名。然后它为主机服务器创建一个 TcpClient

问题来了。当http请求过来时,应该连接服务器的80端口;当 https 请求到来时,它应该连接服务器的端口 443。但是我不知道如何区分http请求和https请求。

一句话提问:如何知道TcpListener接受的是http请求还是https请求?

非常感谢!

最佳答案

您已经解决了一个困扰 Web 服务器管理员很长时间的问题。

过程如下:

  1. Web 浏览器与 Web 服务器上的特定 IP 建立 TCP 连接。
  2. Web 服务器知道它从哪个 IP 获得连接,知道该 IP 仅用于 secure.example.com,因此加载 secure.example.com 的 SSL 证书。
  3. 网络服务器和网络浏览器协商 SSL 连接。
  4. Web 浏览器沿着 SSL 管道发送普通 HTTP header ,其中包括指示要使用的虚拟主机的“HOST:secure.example.com”行。
  5. Web 服务器处理请求并使用沿着 SSL 管道发送的普通 HTTP header 发送响应。

Web 服务器必须在拥有任何 HTTP header 之前决定使用哪个虚拟主机。这是因为它必须首先协商 SSL 连接,并且必须知道首先使用哪个证书。普通的解决方案是使用基于 IP 的虚拟主机——在 IP 地址 X 上运行 Web 服务器;每当服务器收到发送到地址 X 的请求时,它就知道该请求属于为该地址配置的虚拟主机。

该方案的问题是服务器必须为其运行的每个安全网站提供单独的 IP 地址。这可能有很多很多 IP 地址,而且成本高昂或不切实际。

进入 Server Name Indication 。当 Web 浏览器协商与 Web 服务器的 SSL 连接时,Web 浏览器会在 SSL 协商信息中包含它想要连接的主机名。现在 Web 服务器可以使用该信息来创建普通的基于名称的虚拟主机,因此 Web 服务器可以运行一千个不同的安全网站,每个网站都有自己的 SSL 证书,所有这些都在同一个 IP 地址上。世界再次恢复正常。

您想介入其中,这意味着您必须了解 SSL/TLS 协商阶段,解析服务器名称信息,并将请求向下转发到正确的 Web 服务器。

您的新流程如下所示:

  1. Web 浏览器与代理建立 TCP 连接。
  2. 代理开始记录 SSL 交换。
  3. Web 浏览器开始进行 SSL 协商,作为其中的一部分,向下发送服务器名称信息。
  4. 代理解析服务器名称信息,决定应由哪个网络服务器处理请求,并将 SSL 协商信息转发给网络服务器。
  5. 代理人不以其他方式参与协商;它读取 SNI,但在其他方面完全“直通”。
  6. Web 浏览器和服务器完成 SSL 协商,服务器选择正确的虚拟主机,浏览器发送请求的普通 http header 。
  7. 网络服务器通过 SSL 连接读取普通 header ,并处理请求。

既然已经说过了,您可能会意识到,在 SSL 连接协商中插手可能会带来更多麻烦,但得不偿失。事实证明其他一些人已经和你有同样的想法并且已经实现了一些似乎完全符合你想要做的事情的程序 - 搜索“http sni proxy” - 我想出了这个:https://github.com/dlundquist/sniproxy

关于c# - 如何通过http-header区分http和https,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20764286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com