【问题标题】:HTTPS Proxy server in C# [closed]C#中的HTTPS代理服务器[关闭]
【发布时间】:2012-06-21 12:58:26
【问题描述】:

我正在开发 HTTPS 代理服务器。它应该是一个控制台应用程序。我想找到它的手册或示例。我发现了很多件或不工作的样品。我尝试了 MSND 中的 SSLStream 示例,但没有成功。有没有人有一些经验或工作示例?

【问题讨论】:

  • 显示你当前的代码,以及你当前的问题,你会得到更好的答案
  • 为什么这么多 SO 用户私刑新手?这对我来说似乎是一个相关的问题,答案可以在 50 行左右给出,但很难找到,不需要投票。
  • @StevendeSalas 我同意你的看法。他们在世界上一直在鼓励朝着错误的方向改变。
  • 这个问题是如何受到保护并获得 550 票的? stackoverflow.com/questions/224664/…

标签: c# ssl https proxy sslstream


【解决方案1】:

【讨论】:

    【解决方案2】:

    假设您使用的是普通的 HTTPS 代理服务器(而不是 MITM 代理服务器),则根本不需要任何 SSL/TLS 代码。

    它所需要的只是能够解释 HTTP CONNECT 方法并按原样中继往返于 CONNECT 请求中使用的主机和端口(例如 CONNECT host.example.org:443)的流量。

    【讨论】:

      【解决方案3】:

      代码:

      using System;
      using System.Text;
      using System.Net.Sockets;
      using System.Net.Security;
      
      namespace SslTcpClient
      {
          public class SslTcpClient
          {
              public static void Main(string[] args)
              {
                  string host = "encrypted.google.com";
                  string proxy = "127.0.0.1";//host;
                  int proxyPort = 8888;//443;
      
                  byte[] buffer = new byte[2048];
                  int bytes;
      
                  // Connect socket
                  TcpClient client = new TcpClient(proxy, proxyPort);
                  NetworkStream stream = client.GetStream();
      
                  // Establish Tcp tunnel
                  byte[] tunnelRequest = Encoding.UTF8.GetBytes(String.Format("CONNECT {0}:443  HTTP/1.1\r\nHost: {0}\r\n\r\n", host));
                  stream.Write(tunnelRequest , 0, tunnelRequest.Length);
                  stream.Flush();
      
                  // Read response to CONNECT request
                  // There should be loop that reads multiple packets
                  bytes = stream.Read(buffer, 0, buffer.Length);
                  Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes));
      
                  // Wrap in SSL stream
                  SslStream sslStream = new SslStream(stream);
                  sslStream.AuthenticateAsClient(host);
      
                  // Send request
                  byte[] request = Encoding.UTF8.GetBytes(String.Format("GET https://{0}/  HTTP/1.1\r\nHost: {0}\r\n\r\n", host));
                  sslStream.Write(request, 0, request.Length);
                  sslStream.Flush();
      
                  // Read response
                  do
                  {
                      bytes = sslStream.Read(buffer, 0, buffer.Length);
                      Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes));
                  } while (bytes != 0);
      
                  client.Close();
                  Console.ReadKey();
              }
          }
      }
      

      ;)

      【讨论】:

      • 这好像不是服务器吧? ;)
      猜你喜欢
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 2013-05-03
      • 1970-01-01
      • 2020-03-23
      • 2023-02-07
      相关资源
      最近更新 更多