抓包分析 https 密钥协商流程
工具:Wireshark 2.6.6
抓取链接:https://220.181.38.150 (*度地址)
本机地址:100.81.137.224
刚开始分析不知道TLS协议的会话缓存机制,百度使用了会话缓存的这种机制来加速https握手的速度!
客户端使用要恢复的会话的会话ID发送“客户端问候”消息。
服务器检查其会话缓存中是否有匹配的会话ID。如果发现匹配,并且服务器能够恢复会话,则发送具有会话ID的“服务器问候”消息。
注意 如果找不到会话ID匹配,服务器将生成一个新的会话ID和TLS客户端和服务器执行完整的握手。
客户端和服务器必须交换“更改密码规范”消息并发送“客户端完成”和“服务器完成”消息。
客户端和服务器现在可以通过安全通道恢复应用程序数据交换。
---------------------
作者:mapw1993
来源:优快云
原文:https://blog.youkuaiyun.com/u010536377/article/details/78989931
版权声明:本文为博主原创文章,转载请附上博文链接!
简要分析,下面有详细分析
客户端和服务端先通过非对称加密生成一个密钥,之后发送的数据均使用该密钥进行加密,变为对称加密。
- 客户端发送一串随机数(Random1)和客户端支持的加密算法给服务端
- 服务端从客户端发来的加密算法中选择一种,然后向客户端发送一串随机数(Random2)和所选择的加密算法
- 服务端将自己的证书发送给客户端
- 服务端将自己的公钥发送给客户端
- 客户端通过服务端的公钥和一串随机数(Random3)生成密文发给服务端
- 服务端通过私钥解密出 Random3
- 双方通过 Random1、Random2、Random3 和刚开始选择的加密算法生成新的密钥
过滤出我们需要的包数据
- 打开 Wireshark ,选择监控的网卡,如下图
- 选择网卡后,我们发现在这块网卡上有大量的数据在传输,如下图
- 此时我们需要添加一些过滤条件,过滤出我们需要的数据
// 本机地址 100.81.137.224 远程地址 220.181.38.150
((ip.src == 100.81.137.224 and ip.dst == 220.181.38.150) or (ip.dst == 100.81.137.224 and ip.src == 220.181.38.150) )
- 我们发现,现在没有符合条件的数据包,我们打开浏览器(推荐使用浏览器的无痕模式或隐私模式),输入抓取数据包的网址 https://220.181.38.150
- 等网页加载完毕后,我们可以停止捕获,然后对数据进行分析。
- 数据包太多,我们再追加一项过滤条件 and tcp.port == 52324 ,近分析 52324 与 443 端口的通信数据。
// 完整条件
((ip.src == 100.81.137.224 and ip.dst == 220.181.38.150) or (ip.dst == 100.81.137.224 and ip.src == 220.181.38.150) ) and tcp.port == 52324
分析
- 客户端与服务器首先进行三次握手建立连接,然后再进行密钥的协商。
- 序号 7842 是客户端发送给服务端的包, Info 字段显示为 Client Hello,如图
- 这个包中我们暂时仅关注 Random、Cipher Suites
- Random 是客户端生成的一串随机数,我们暂时叫做 随机数1
- Cipher Suites 是客户端支持的加密算法
- 序号 7844 是服务端发送给客户端的包,Info 字段显示为 Server Hello
- 这个包中我们暂时仅需要关注 Random 和 Cipher Suite
- Random 是服务端生成的一串随机数,我们暂时叫做 随机数2
- Cipher Suite 是服务端从客户端发来的加密算法中所选择的一种
- 序号 7848 中是服务端发送给客户端的,Info 字段显示为 Certificate
- 这是服务端将自己的证书和证书发放机构发给了客户端
- 客户端收到后会验证证书的真伪
- 序号 7851 中是服务端发送给客户端的,Info 字段显示为 Server Key Exchange
- 这里面的 Pubkey 是证书的公钥、Signature是一个签名
- 签名用来确保公钥不被篡改
- 序号 7853 是服务端发送给客户端的,Info 字段显示为 Server Hello Done
- 这个包表示服务端把需要发的已经发放完毕
- 序号 7855 是客户端发向服务端的,这里做了优化处理,将三个包合为一个包
- Client Key Exchange
1. 这一步也是交换密钥操作,可以理解为发送一个随机数,不过这个随机数经过公钥进行加密 - Change Cipher Spec
1. 告诉服务端以后发送的数据使用最新密钥 - Encrypted Handshake Message
1. 这是一条空消息,用来确认前面步骤生成的密钥是否正确
服务端收到序号为 7855 这个包后,会通过自己的私钥对发来的数据进行解密,解密成功后客户端和服务端均拥有三串随机数,然后通过前两步约定的加密算法对这三串数据进行加密,生成新的密钥,以后服务端与客户端之间的数据全部使用新的密钥进行加密传输。
序号 7856 是客户端发向服务端的包,Info 字段为 Application Data。
可以看到这些数据全部都是加密过后的数据
https 与 http 包信息比对
上图是 https 的包信息,下面是使用 http 所发送的包信息,这两个包所请求的资源是同一资源。
序号 487、488、489 建立连接后,直接发送 490 数据包,没有进行密钥协商和数据加密
我们可以通过抓包得到的数据解析出客户端和服务端交互所产生的所有数据信息。
可见 https 比 http 更加安全。
参考博客: