charles 抓包 connect 类型请求,失败原因

使用Charles抓取Https请求时,遇到Method为CONNECT模式下的请求均失败

connect是为了建立http tunnel,connect是http众多方法中的其中一种,它跟post、get、put、options方法是并列的。但是它的使用场景很特殊。只有在受限制的网络环境中(防火墙、NAT、代理器)并且是https通信时,客户端使用http connect请求代理服务器,代理服务器使用connect方法与目标服务器建立http tunnel,通道建立后,客户端与服务器进行通信,代理服务器就像透明一样,只是接收、转发tcp stream(无法抓取)。

以下内容来自http://blog.itpub.net/15480802/viewspace-1340982/

connect方法

http 1.1定义了8种方法,connect为其中之一,HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

并非所有的http隧道支持connect方法,Http隧道分为两种:

不使用CONNECT的隧道

不使用CONNECT的隧道,实现了数据包的重组和转发。在Proxy收到来自客户端的Http请求之后,会重新创建Request请求,并发送到目标服务器,。当目标服务器返回Response给Proxy之后,Proxy会对Response进行解析,然后重新组装Response,发送给客户端。所以,在不使用CONNECT方式建立的隧道,Proxy有机会对客户端与目标服务器之间的通信数据进行窥探,而且有机会对数据进行串改。

使用CONNECT的隧道

而对于使用CONNECT的隧道则不同。当客户端向Proxy发起Http CONNECT Method的时候,就是告诉Proxy,先在Proxy和目标服务器之间先建立起连接,在这个连接建立起来之后,目标服务器会返回一个回复给Proxy,Proxy将这个回复转发给客户端,这个Response是Proxy跟目标服务器连接建立的状态回复,而不是请求数据的Response。在此之后,客户端跟目标服务器的所有通信都将使用之前建立起来的建立。这种情况下的Http隧道,Proxy仅仅实现转发,而不会关心转发的数据。这也是为什么在使用Proxy的时候,Https请求必须首先使用Http CONNECT建立隧道。因为Https的数据都是经过加密的,Proxy是无法对Https的数据进行解密的,所以只能使用CONNECT,仅仅对通信数据进行转发。


你可能感兴趣的:(charles 抓包 connect 类型请求,失败原因)