第一步, charles向服务器发送请求进行握手, 获取到服务器的CA证书, 用根证书公钥进行解密, 验证服务器数据签名,获取到服务器CA证书公钥。这一步其实charles模拟的就是普通用户访问服务端,为了拿到通信的公钥而已。
第二步, charles伪造自己的CA证书, 冒充服务器证书传递给客户端浏览器,客户端浏览器做跟charles一样的事。
第三步, 客户端浏览器生成https通信用的对称密钥,用charles伪造的证书公钥加密后传递给服务器, 被charles截获。
第四步, charles将截获的密文用自己伪造证书的私钥解开,获得https通信用的对称密钥。
第五步, charles将对称密钥用服务器证书公钥加密传递给服务器, 服务器用私钥解开后建立信任,握手完成, 用对称密钥加密消息, 开始通信。
第六步, charles接收到服务器发送的密文, 用对称密钥解开,获得服务器发送的明文。再次加密, 发送给客户端浏览器。
第七步, 客户端向服务器发送消息, 用对称密钥加密, 被fidller截获后,解密获得明文。
由于charles一直拥有通信用对称密钥, 所以在整个https通信过程中信息对其透明。也就是说fiddler&charles向服务器冒充是客户端,向客户端又谎称自己是服务器。
差不多就是两套RSA密钥,首先charles当做客户端向目标服务器请求,ssl握手获取证书保存公钥。然后抓包的时候我们会设置代理而且信任根证书装到手机上抓包HTTPS。我们的请求被charles截获,因此本来你和服务器建立的ssl,结果变成了你和charles建立了ssl,所有数据都发送给了charles,但是为什么能信任呢?不是根证书验证么?这可不,你自己不是刚把charles的证书装到手机并且信任了么,自然能验证合法性了,即便charles的证书是自制的。这时,ssl的时候传输的数据加密公钥,其实是charles的,你把数据传给charles,就能被charles解密(因为之前被截获,你其实就是和中间人在协商建立SSL连接了),然后charles模拟客户端请求,用原先得到的公钥加密去得到正确的密钥(charles和服务器建立SSL),来获取真实数据,然后所有的数据都会经过Charles,如果数据没有加密,即便是HTTPS,能被抓包数据或者攻击,就能看到明文了,这就是中间人攻击的原理。客户端和charles模拟一套,charles和服务器模拟一套。
原文:https://blog.csdn.net/Deft_MKJing/article/details/82868900
网友评论