当浏览器需要同过代理(例如Fiddler)发送HTTPS请求时,存在一些问题。
代理需要知道将客户端的请求发送到哪里,但是使用HTTPS保护流量的全部目的是对内容进行加密,并且网络上的任何人(包括代理)都无法读取内容!
为了解决此问题,使用了一个技巧-浏览器使用CONNECT方法以及客户端希望连接的目标主机名和端口发送HTTP请求:
CONNECT bayden.com:443 HTTP / 1.1
主机:bayden.com:443
连接:keep-alive
用户代理:Chrome / 47.0.2526.58
收到这样的请求后,期望代理建立与请求的主机名和端口的TCP/IP连接,并通过返回指示已建立请求的HTTP/200相应来表示成功:
HTTP / 1.1 200连接已建立
连接:关闭
随后,代理服务器仅仅盲目的在客户端和服务器连接之间来回拖拉所有字节,而无需查看它们。客户端和服务器执行其HTTPS握手,然后交换加密的流量(通常是一个或多个HTTPS请求和相应)。当不在需要连接时,任一侧都关闭连接,而代理服务器在收到一侧已关闭连接的通知后,也会关闭连接的另一侧。
我们经常引号以这张方式建立连接 Proxy Tunnels。
在Fiddler中,隧道有灰色锁定图标表示,带有文本“Tunnel to”代替“主机”字段。URL字段显示目标主机名和端口,如屏幕截图的第一行所示:
值的注意的是,Fiddler不仅限于盲目的代理隧道,它还可以对连接的两端执行中间人操作,向客户端假装它是服务器,冰箱服务器假装它是客户端。在Fiddler中启用HTTPS解密时,在Web回话列表中的代理隧道之后是童工该隧道传输的所有请求和相应(如截图的第二行和第三行)。
-Eric