Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过代理转发SSL(HTTPS)响应?_C#_Https_Proxy_Tcplistener - Fatal编程技术网

C# 如何通过代理转发SSL(HTTPS)响应?

C# 如何通过代理转发SSL(HTTPS)响应?,c#,https,proxy,tcplistener,C#,Https,Proxy,Tcplistener,我必须跟踪HTTP流量。它在没有Https的情况下工作。我尝试使用https,它成功地通过证书通过Sslstream获得响应。当我为中继转发ssl响应,但它没有得到响应时 请告诉我如何中继SSL响应 请检查以下代码以获取相同信息 谢谢 public void ThreadHandleHTTPClient(object o) { try{ Socket client = (Socket)o; Stream ns = new Ne

我必须跟踪HTTP流量。它在没有Https的情况下工作。我尝试使用https,它成功地通过证书通过Sslstream获得响应。当我为中继转发ssl响应,但它没有得到响应时

请告诉我如何中继SSL响应

请检查以下代码以获取相同信息

谢谢

 public void ThreadHandleHTTPClient(object o)
 {
try{
                Socket client = (Socket)o;

                Stream ns = new NetworkStream(client);
                //Stream outStrem = ns;
                //RECEIVE CLIENT DATA
                byte[] buffer = new byte[2048];
                int rec = 0, sent = 0, transferred = 0, rport = 0;
                string data = "";
                do
                {
                    rec = ns.Read(buffer, 0, buffer.Length);
                    data += Encoding.ASCII.GetString(buffer, 0, rec);
                } while (rec == buffer.Length);

                //PARSE DESTINATION AND SEND REQUEST
                string line = data.Replace("\r\n", "\n").Split(new string[] { "\n" }, StringSplitOptions.None)[0];
                string e=line.Split(new string[] { " " }, StringSplitOptions.None)[1];
                Uri uri = new Uri(e);
                if (uri.Scheme == "https" || line.Contains("CONNECT"))
                {
                    rport = 443;
                    //Make tunnel for the HTTPS which is authentic host.
                   SslStream sslStream = sslTunnel(ns, uri.OriginalString, "1.0");
                   ns = sslStream;

                   string remoteUri = "https://" + uri.Scheme;
                   StreamReader clientStreamReader = new StreamReader(sslStream);


                   string httpCmd = clientStreamReader.ReadLine();
                   string[] splitBuffer = httpCmd.Split(_spaceSplit, 3);
                   remoteUri = remoteUri + splitBuffer[1];

                   myQuery = string.Empty;
                   //Read the SSL Stream save command in myQuery variable.
                   readRequestHeadersEx(clientStreamReader);
                   data = myQuery;
                   data = splitBuffer[0]+" ";
                   data += remoteUri;
                   data += " ";
                   data += splitBuffer[2];
                   data += "\r\n";
                   data += myQuery;
                   data += "\r\n";

                   line = data.Replace("\r\n", "\n").Split(new string[] { "\n" }, StringSplitOptions.None)[0];
                   uri = new Uri(line.Split(new string[] { " " }, StringSplitOptions.None)[1]);               

                }
                else
                {
                    rport = 80;                   
                }

                IPHostEntry rh = Dns.GetHostEntry(uri.Host);
                Socket remoteserver = new Socket(rh.AddressList[0].AddressFamily, SocketType.Stream, ProtocolType.IP);
                remoteserver.Connect(new IPEndPoint(rh.AddressList[0], rport));
                byte[] databytes = Encoding.ASCII.GetBytes(data);
                remoteserver.Send(databytes, databytes.Length, SocketFlags.None);

                //START RELAY
                buffer = new byte[2048];
                rec = 0;
                data = "";
                do
                {

                    transferred = 0;
                    do
                    {
                        rec = remoteserver.Receive(buffer, buffer.Length, SocketFlags.None);
                        sent = client.Send(buffer, rec, SocketFlags.None);
                        transferred += rec;
                        data += Encoding.ASCII.GetString(buffer, 0, rec);
                    } while (rec == buffer.Length);

                    if (transferred == 0)
                        break;

                } while (transferred > 0);

                client.Close();

            }
            catch (Exception ex)
            {

            }
        }

public void Start(IPAddress ip, int port)
            {     
 TcpListener listener = new TcpListener(ip, port);
                listener.Start(100);
                while (true)
                {
                    Socket client = listener.AcceptSocket();
                    Thread th = new Thread(ThreadHandleHTTPClient);
                    th.Start(client);
                }

                listener.Stop();         
            }

中继SSL?我不知道您为什么要这样做……但SSL的设计是为了防止中间人攻击,这看起来很可疑。如果确实是这样的话,您需要做一些类似于fiddler的事情,使用受信任的SSL证书并为您连接到的每个主机动态创建SSL证书。感谢快速回复,实际上我想记录https和HTTP通信量。是的,它是“中间人”,并且按照你的建议做同样的事情。为每个主机应用SSL证书,它工作正常。当我将SSLStream响应转发给继电器时,我没有得到响应。请检查以下步骤中的SSL中继,1)如果找到连接和https方法2)SSL身份验证3)读取SSL流4)简而言之,如果完成步骤4,套接字将无法接收单个字节。您可以在附加的代码中找到“启动中继”标记。中继?:连接到远程主机并接收数据并将其转发到本地代理。