0%

HTTPS代理原理

HTTPS代理原理

摸了两天的鱼,今天晚上找了一晚上资料把这段补上
HTTPS系列学习的根本原因都是因为最近在学习代理怎么用,然后对在代理下运行的HTTPS安全性产生了一定的困惑,加之以burp能明文抓取HTTPS包,更加困惑了

今天最后翻到了一个国外超级大哥文章的翻译,感觉是众多资料中讲的最清楚的了
在一切开始之前,先回顾一下https链接建立到TLS握手之间的操作

正常的HTTPS链接建立过程

再摸一个图出来
HTTPS链接建立
可以看到,大家还是老老实实先来一个TCP三次握手,先把TCP层面的链接建立起来,然后开始进行TLS的握手,client hello,server hello+证书,随机数验证blblbl,走上上篇文章讲到的HTTPS认证过程的老路,这里重复一次的意义就是引入这个TCP链接建立过程,方便后面讲

然后我们来看代理的两大类别,转发代理和TLS终止代理

转发代理

由于TLS在TCP层之上建立起了一个安全层,那么代理就需要在安全层之下来实现流量的转发

CONNECT请求

使用代理都会发送这个请求,用于告诉代理服务器在客户端和目标站点之间建立一条隧道,当代理服务器和目标站点TCP握手成功之后,就回复给客户端一个200 connection established,就算是开了一个通道
在这之后,转发代理就简单的进行流量的转发,服务器和客户端之间的TLS握手对代理服务器而言是加密过的,代理服务器并不能解析,只是做一个简单的转发,代理服务器感觉上就像是一跳特殊的路由一样
(之前愚蠢的思考了一下为什么CONNECT明文告诉代理请求某些域名怎么不会被ban,才想起来原来代理自己还要加一层vmss加密过gfw)
一般来说代理都是转发代理,毕竟代理也拿不到服务器的私钥,怎么解密加密流量呢

不过转发代理也是看得见HTTP流量的,所以大家还是小心一点哦

TLS终止代理

也可以称为中间人代理,典型代表就是burp suite,这篇文章出现的原因一部分就是因为我一直在想burp为什么导入证书之后能抓HTTPS包

显然,从名字上就可以看出,burp完成了一次中间人攻击,不过并不是偷了服务器的密钥,而是给我们签一个假证书
我们导入了一个burp的根证书,burp就以此为基础,通过我们CONNECT请求中请求的域名去来临时签一个假证书和客户端通信。也就是说,burp同时在客户端和服务器之间开启了两个HTTPS连接,TLS加密在burp这里就终止了,故它也成为TLS终止代理
我们和持有对应域名的假证书的burp进行通信,而burp由于持有假证书的私钥,当然能和我们的加解密来的有来有回,所以我们才能看见https的明文信息
burp代理一个HTTPS连接的过程是这样的:
1.和客户端建立TCP连接
2.客户端发送CONNECT请求
3.直接回一个200 established
4.客户端开始进行TLS握手,client hello
5.burp用假证书server hello,完成TLS握手
6.客户端开始请求目标站点(此时建立的就是和burp的https连接,burp完全看得见HTTPS内容)
7.burp临时和目标站点TCP握手
8.burp和目标站点完成TLS握手
9.开始数据传输

这里有一个小细节在于burp不先和服务器TCP握手,一直要到客户端请求了数据才临时从头开始建立连接

SNI代理

Server Name Indication 服务器名称指示
SNI出现的原因是,客户端建立完TCP连接后,会先进行TLS握手,再发送HTTP请求,而实际上服务器只有在获取HTTP请求之后才知道客户端访问的是哪个域名,那么如果访问的服务器存在多个域名,而这些域名对应了多个证书,服务器就不知道该回哪一个证书了
所以为了解决这个问题,需要在TLS握手的client hello里面加一个SNI字段
如上是SNI内容
但是我没懂这个过程和代理有什么关系
SNI代理也是一种TLS阻断代理,这是已知结论
rmb神仙说是读SNI之后访问对应的目标网站
也有一说就是一个自建DNS一样的服务,把对应域名全部映射到SNI服务器上,SNI服务器再去转发流量
目测情形应该也是自签发假证书,和服务器开一个连接和客户端开一个连接,仅能代理https
没有特别懂这个代理的意义是什么

代理感知型客户端

即proxy-aware clients,难道没有在一瞬间考虑过为什么浏览器会发一个CONNECT请求给代理服务器?我怎么知道我有没有在用代理?你还真说对了,像浏览器这类软件还真就知道自己有没有在用代理,在感知到自己在用代理的时候就会发CONNECT请求来告诉代理访问谁

至此,一切都解释的通了,我又完全懂了(除了SNI)

参考文章

全靠这篇看懂的好吧,一篇解决所有烦恼
HTTP(s)代理是如何工作的?
这篇讲SNI的没太看懂,上面这篇的最后也有提到SNI,并且认为这是一个TLS终止代理?
SNI proxy