开发代理脚本

时间:2013-09-02 11:31:33

标签: ssl https proxy tunneling

在开发开源代理脚本时,下面是一段代码:              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); 错误的解释是:无法从传输连接中读取数据。远程主机强行关闭现有连接。 或此错误:Autentication失败,因为远程方已关闭传输流。 请帮我 感谢

1 个答案:

答案 0 :(得分:2)

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

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

更新:我写了一个小article来描述两种类型的代理。