没有证书的 c# 代理 ssl/tls 直通

标签 c# ssl https proxy tls1.2

这就是问题。

我有一个 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/

相关文章:

c# - 尝试将给定 ID 与数据库中存储的 ID 进行比较

java - 如何在不禁用 ssl 验证的情况下调用 https URL?

ssl - 使用 DCOS 负载均衡器设置 SSL 终止

python - Heroku 仍然重定向到 https

c# - HTTPS 重定向导致错误 "Server cannot append header after HTTP headers have been sent"

c# - C#中如何从Treeview的选定节点中获取下一个直接节点?

c# - 在 C# 扩展函数中使用泛型

python - 使用 python api 和私钥访问谷歌云存储 - Bad Handshake

java - java - 如何使用java keystore而不是证书和 key 文件在java中使用ssl实例化grpc服务器?