由于工作上的需要,要使用WireShark来抓包;第一次使用WireShark,有点慌,只能慢慢摸索了..
研究了一个下午,终于有点门道了,mark一下。
WireShark使用步骤:
1.打开WireShark,然后双击“以太网”,我这边是使用“以太网”捕获数据
2.打开谷歌浏览器,进入百度,然后随便搜索什么,以为百度是https请求
3.选择过滤,我的表达式:ssl && (ip.dst == 180.101.49.111||ip.src == 180.101.49.111)
4.然后WireShark界面出现一系列的ip地址和请求协议,如图:
5.这些莫名奇妙的数据到底代表啥呢,让我娓娓道来...φ(゜▽゜*)♪
6.TLS整个握手过程如下:
敲黑板,划重点了,接下来就很关键了...
接下来就重点介绍下TLS握手过程
1.Client Hello
这是TLS握手的第一步
客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下:
• 支持的最高TSL协议版本version,从低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,当前基本不再使用低于 TLSv1 的版本;
• 客户端支持的加密套件 cipher suites 列表, 每个加密套件对应前面 TLS 原理中的四个功能的组合:认证算法 Au (身份验证)、**交换算法 KeyExchange(**协商)、对称加密算法 Enc (信息加密)和信息摘要 Mac(完整性校验);
• 支持的压缩算法 compression methods 列表,用于后续的信息压缩传输;
• 随机数 random_C,用于后续的**的生成;
• 扩展字段 extensions,支持协议与算法的相关参数以及其它辅助信息等,常见的 SNI 就属于扩展字段,后续单独讨论该字段作用。
2.Server Hello
服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite,选择的压缩算法compression method、随机数 random_S 等,其中随机数用于后续的**协商
3.Certificate
服务器端配置对应的证书链,用于身份验证与**交换
4.Server Key Exchange
当 server certificate 没有携带足够的信息时,发送给客户端以计算 pre-master,如基于DH 的证书,公钥不被证书中包含,需要单独发送
5.Server Hello Done
服务器返回此协议数据,告诉客户端已经完成
6.Client Key Exchange
合法性验证通过之后,客户端计算产生随机数字 Pre-master,并用证书公钥加密,发送给服务器
7.Change Cipher Spec
客户端通知服务器后续的通信都采用协商的通信**和加密算法进行加密通信
8.Encrypted Handshake Message
服务器也结合所有当前的通信参数信息生成一段数据并采用协商** session secret 与算法加密并发送到客户端
9.TLS握手完成
客户端计算所有接收信息的 hash 值,并采用协商**解密Encrypted Handshake Message,验证服务器发送的数据和**,验证通过则握手完成。
抓包 HTTPS 通信主要包括三个过程:TCP 建立连接、TLS 握手、TLS 加密通信,主要分析 HTTPS 通信的握手建立和状态等信息。
**交换算法介绍:
**交换算法目前常用的有RSA和Diffie-Hellman。
对于**交换使用RSA算法,pre-master-secret由客户端生成,并使用公钥加密传输给服务器。
对于**交换使用Diffie-Hellman算法,pre-master-secret则通过在Key Exchange阶段交换的信息,由各自计算出pre-master-secret。所以pre-master-secret没有存到硬盘,也没有在网络上传输,wireshark就无法获取session key,也就无法解密应用数据。