这就是问题。
我有一个 https 请求。该请求作为 SSL/TLS 请求发送(不是来自具有代理设置的浏览器的 CONNECT ....)。
我需要用 C# 编写一个代理来阻止特定的 https://foo.com/foo.htm请求但允许通过 https://foo.com/anything_else.htm .
我可以用新证书等创建 MITM 攻击,这很好。
但我现在想知道是否有一种简单的方法可以在不使用 MITM 攻击的情况下执行此操作,因为我不需要解密数据。我只需要知道 URI/文件。
我可以很容易地传输流,但我想知道在我读取 URI 和文件后是否有一种简单的方法来传输流。
我可以编写一些花哨的代码来分离 tcp 请求,这就是我可能需要做的。
在我走这条路之前,任何人都有任何想法。请记住,没有 CONNECT 请求。只需直接 SSL/TLS。
这样做的主要原因是它只是让事情变得更简单,而不是创建自签名证书等。
也许甚至可以从服务器端以某种方式使用真实证书,因为我不需要解密任何无 header 数据。
我发现 c# 的网络方面没有很好的文档,而且到处都是。
仅供引用,我可以使用以下方法从 TcpClient 获取 URI:
IPEndPoint ipEndPoint = (IPEndPoint)clientTcpClient.Client.RemoteEndPoint;
IPAddress ipAddress = ipEndPoint.Address;
// Get the hostname.
IPHostEntry ipHostEntry = Dns.GetHostEntry(ipAddress);
String hostName = ipHostEntry.HostName;
// Get the port.
Int32 port = ipEndPoint.Port;
但不是请求的页面。
最佳答案
虽然目标主机名可能在 TLS 握手中作为 SNI 扩展可见,或者通过分析服务器返回的证书URL 的路径部分仅包含在 HTTP 请求中。由于此 HTTP 请求仅在 TLS 握手后完成,因此请求已加密如果不解密请求,您将无法获得完整路径。这意味着如果没有 SSL 中间人,就不可能阻止对特定路径的访问,因此需要中间人拥有并受客户端信任的目标站点证书。
对于 CONNECT 请求而言,情况并非如此,因为这些请求仅包含目标主机名,但路径组件再次仅包含在由 CONNECT 创建的隧道内发送的加密 HTTP 请求中。
关于没有证书的 c# 代理 ssl/tls 直通,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40032557/