3

在开发一个开源代理脚本时,一段代码如下: static void Main(string[] args) { string host = "www.google.com"; int proxyPort = 443;//443;

            byte[] buffer = new byte[2048];
            int bytes;

            // Connect socket
            TcpClient client = new TcpClient(host, proxyPort);
            NetworkStream stream = client.GetStream();


            byte[] tunnelRequest = Encoding.UTF8.GetBytes(String.Format("CONNECT www.google.com:443 HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:23.0) Gecko/20100101 Firefox/23.0\r\nProxy-Connection: keep-alive\r\nConnection: keep-alive\r\nHost: www.google.com\r\n\r\n", host));
            stream.Write(tunnelRequest, 0, tunnelRequest.Length);
            stream.Flush();

            SslStream sslStream = new SslStream(stream);
            sslStream.AuthenticateAsClient(host);
      } 

当我运行代码时,在这一行发生错误: sslStream.AuthenticateAsClient(host); 错误的解释是:无法从传输连接中读取数据。现有连接被远程主机强行关闭。或此错误:验证失败,因为远程方已关闭传输流。请帮帮我谢谢

4

1 回答 1

2

你似乎混合了两个概念。CONNECT 动词用于告诉代理必须建立一个不透明的隧道。在这种情况下,代理只是将从一侧接收到的数据转发到另一侧。在这种情况下,您不需要任何 SSL。

如果您想充当代理,即接收客户端请求,解析它们,做其他事情,然后连接到服务器以获取资源,那么您不需要处理 CONNECT 动词 - 您可以处理 GET、HEAD、POST 等要求。

更新:我写了一篇小文章,描述了两种类型的代理。

于 2013-09-02T12:13:40.633 回答