本文首发于个人博客,文章链接为:https://blog.d77.xyz/archives/6fb5f2d2.html
偶然的机会,发现 HTTP 代理和 HTTPS 代理这两个词,没接触过 HTTPS 代理,所以动手查了查,记录一下。
HTTP 代理
普通的 HTTP 代理是将浏览器发出的 HTTP 请求直接发送到代理服务器,然后代理服务器将 HTTP 请求进行解析,添加对应的源 IP(这里不考虑高匿代理),根据代理服务器的不同会对请求头进行不同的修改,然后将修改后的请求头和请求体一起发送到对应的服务器,然后等待服务器回复,将服务器返回的 HTTP 请求转发给客户端,完成代理任务。在这种情况下,HTTP 请求存在数据被代理服务器修改的情况,如果连接的是一个恶意的代理服务器,那么就可能存在数据泄露,隐私泄露等情况。使用 HTTPS 协议来访问对应服务器就可以避免这种问题。
为了确保数据的安全,HTTPS 请求的域名和端口都是加密的,所以代理服务器无法进行解析,也就无法修改对应的请求体,无法进行正常的 HTTP 转发任务。为了解决这个问题,就需要用到 CONNECT 方法。
- 当使用设置了代理服务器的浏览器发送 HTTPS 请求时,浏览器会先发送 CONNECT 包(未加密的)到代理服务器。
CONNECT www.microsoft.com:443 HTTP/1.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: www.microsoft.com
Content-Length: 0
DNT: 1
Connection: Keep-Alive
Pragma: no-cache
- 代理服务器根据包中的内容,会在对应端口上和目标站点就建立一个 TCP 连接,建立成功后,会给客户端返回一个 HTTP 200 的状态码告知已连接成功。
HTTP/1.0 200 Connection Established
FiddlerGateway: Direct
StartTime: 11:56:22.008
Connection: close
EndTime: 11:56:22.538
ClientToServerBytes: 1416
ServerToClientBytes: 1358
- 之后浏览器会和目标网站进行正常的 HTTPS 握手请求,建立 TLS 隧道,并交换加密数据,代理服务器只会进行数据的转发,不会读取数据包中的内容,因为数据是加密的,所以想读取也是读取不了的。通过下图的抓包可以看出来,在进行了 TCP 三次握手之后,浏览器发送了 CONNECT 请求到代理服务器,之后代理服务器返回了 HTTP 200 的状态码告知已连接成功,然后浏览器开始和目标网站进行正常的 TLS 握手过程。
<