2016-02-28 166 views
0

我想使用TcpClient阅读Https页面。我用下面的代码Http CONNECT请求返回空响应

var client = new TcpClient(url, 443);//"127.0.0.1", 8888);// Fiddler port 
client.SendTimeout = 30000; 
Stream responseStream = client.GetStream(); 

// send CONNECT request to server 
byte[] tunnelRequest = Encoding.ASCII.GetBytes("CONNECT www.google.com:443 HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:44.0) Gecko/20100101 Firefox/35.0\r\nProxy-Connection: keep-alive\r\nConnection: keep-alive\r\nHost: www.google.com:443\r\n\r\n"); 
responseStream.Write(tunnelRequest, 0, tunnelRequest.Length); 
responseStream.Flush(); 

// read CONNECT response 
string connectResponse = ReadResponse(responseStream); 
Console.WriteLine("server connect response : " + connectResponse); 

即发送CONNECT请求主机(google.com)

CONNECT www.google.com:443 HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0 
Proxy-Connection: keep-alive 
Connection: keep-alive 
Host: www.google.com:443 

必须输入反应不会停这样

HTTP/1.1 200 Connection Established 
StartTime: 22:42:38.774 
Connection: close 

responseStream任何回报。当我使用提琴手作为代理

var client = new TcpClient("127.0.0.1", 8888); 

它工作正常,并返回200响应。小提琴手修理它有什么不对吗?

我使用Windows 8.1并使用.Net 2和4.5.1进行测试。

回答

0

基于rfc当代理存在时使用CONNECT方法。

TLS以来,特别是需要终端到端到端连接提供 认证和防止人在这方面的中间人攻击,本备忘录 指定CONNECT方法建立跨越代理的隧道。

在直接通信的情况下:

var client = new TcpClient("127.0.0.1", 8888);//url, 443);// 
client.SendTimeout = 30000; 
Stream responseStream = client.GetStream(); 

// Wrap in SSL stream 
SslStream sslStream = new SslStream(responseStream); 
sslStream.AuthenticateAsClient(url); 

byte[] byts = Encoding.ASCII.GetBytes("GET/HTTP/1.1\r\nHost: www.google.com\r\nConnection: keep-alive\r\n\r\n"); 
sslStream.Write(byts, 0, byts.Length); 

var str = ReadResponse(sslStream);