Http CONNECT 请求返回空响应

本文关键字:响应 返回 请求 CONNECT Http | 更新日期: 2023-09-27 18:36:47

我想使用 TcpClient 阅读 Https 页面。我使用以下代码

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进行测试。

Http CONNECT 请求返回空响应

基于代理存在时使用的 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);