抓包分析HTTPS理论落地
概述
https的复杂性在于历史版本较多、涉及密码学知识、协议具体流程也比较复杂。
重点理解的应该是密钥协商过程,客户端证书认证(涉及证书链),CA证书签发几个问题的细节。
前面几篇文章都是注重一部分的内容讲解,当然声明没有标注原创的,都是从别的地方抄来的,觉得写得好的正确的就拿过来。
理论总归是理论,还得结合实践来做,这篇文章就主要通过wireshark来理解下https,将理论落地。
其实微信团队有写过一系列的tls协议的分析实现,但是对于刚开始了解https的人来讲感觉不是特别友好,因为涉及太多细节。
我个人的学习路径是自顶向下的,先从顶部理解整体,再将整体分解,每一部分进行逐步细化,最终构建一个体系。
整体流程
这个应该之前有讲过,和抓包有些出入,倒不是之前讲的不对,而是理论和实际工程实现的偏差。
这个实验别人已经做过了,我自己也抓了一次对比了下,当然我也就不自己再费力气写一篇了,只是将自己看完之后对比前面的文章有疑惑的点做一些解释澄清。
本次抓包实验对象是baidu.com,并选择TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256加密算法组合。

1. 客户端发送ClientHello
客户端发起握手协商操作,它将发送一个ClientHello消息给服务器,消息中明确了其所支持的SSL/TLS版本、Cipher suite加密算法组合等,可以让服务器选择,并提供了一个客户端随机数,用于以后生成会话密钥使用。
2. 服务器返回ServerHello

服务器将返回一个ServerHello消息,该消息包含了服务器选择的协议版本、加密算法,以及服务器随机数、会话ID等内容。其中,服务器选择的协议版本应小于等于客户端ClientHello中的协议版本。
本次实验中服务器确认使用TLS 1.2版本的协议,并选择TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256加密算法组合。
3. 服务器发送Certificate

服务器发送ServerHello消息,选择好协议版本和加密算法组合后,将发送Certificate消息,该消息包含了服务器的证书等信息,可通过证书链认证该证书的真实性。根据选择的加密算法组合的不同,服务器证书中的公钥也可被用于加密后面握手过程中生成的Premaster secret。
4. 服务器发送ServerKeyExchange

服务器发送ServerKeyExchange消息,消息中包含了服务器这边的EC Diffie-Hellman算法相关参数。此消息一般只在选择使用DHE 和DH_anon等加密算法组合时才会由服务器发出。
5. 服务器发送ServerHelloDone

服务器发送ServerHelloDone消息,告知客户端服务器这边握手相关的消息发送完毕。
6. 客户端发送ClientKeyExchange
客户端发送ClientKeyExchange消息,消息中包含客户端这边的EC Diffie-Hellman算法相关参数,然后服务器和客户端都可根据接收到的对方参数和自身参数运算出Premaster secret,为生成会话密钥做准备。
7. 客户端发送ChangeCipherSpec

客户端向服务器发送ChangeCipherSpec消息,通知服务器此消息以后客户端会以加密方式发送数据。
8. 客户端发送Finished

客户端使用之前握手过程中获得的服务器随机数、客户端随机数、Premaster secret计算生成会话密钥,然后使用该会话密钥加密之前所有收发握手消息的Hash和MAC值,发送给服务器,服务器将相同的会话密钥(使用相同方法生成)解密此消息,校验其中的Hash和MAC值。
9. 服务器发送ChangeCipherSpec
服务器使用会话密钥加密(生成方式与客户端相同,使用握手过程中获得的服务器随机数、客户端随机数、Premaster secret计算生成)之前所有收发握手消息的Hash和MAC值,发送给客户端去校验。
若客户端服务器都校验成功,握手阶段完成,双方将按照SSL记录协议的规范使用协商生成的会话密钥加密发送数据。
声明/参考链接
以上步骤和抓包均来自ArkTeam的下面一篇文章:https://www.freebuf.com/articles/network/116497.html[1]
其他参考资料:
https://www.thesslstore.com/blog/explaining-ssl-handshake/#diffie-hellman-authentication[2] https://www.cnblogs.com/fishou/p/4206451.html[3] https://chziyue.com/post/57.html[4] https://blog.nlogn.cn/posts/pfs-ecdhe/#rsa%E7%AE%97%E6%B3%95%E7%9A%84%E6%B5%81%E7%A8%8B[5] https://mp.weixin.qq.com/s/5MB_9HmhUhDshbgTUKJgsg http://abonege.github.io/2018/01/05/SSL%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E6%80%BB%E7%BB%93/
疑问
DH算法加密中需要模数和基数,这两个参数在哪里传递? 由于这里使用的是ECDHE算法,参数可能不一样,可以参看另外一篇文章里面有抓DH的包。
https://blog.csdn.net/fw0124/article/details/40983787[6]
抓包截图如下:
ECDHE算法参数可参考这里:https://chziyue.com/post/57.html[7]
参考资料
https://www.freebuf.com/articles/network/116497.html: https://www.freebuf.com/articles/network/116497.html
[2]https://www.thesslstore.com/blog/explaining-ssl-handshake/#diffie-hellman-authentication: https://www.thesslstore.com/blog/explaining-ssl-handshake/#diffie-hellman-authentication
[3]https://www.cnblogs.com/fishou/p/4206451.html: https://www.cnblogs.com/fishou/p/4206451.html
[4]https://chziyue.com/post/57.html: https://chziyue.com/post/57.html
[5]https://blog.nlogn.cn/posts/pfs-ecdhe/#rsa%E7%AE%97%E6%B3%95%E7%9A%84%E6%B5%81%E7%A8%8B: https://blog.nlogn.cn/posts/pfs-ecdhe/#rsa%E7%AE%97%E6%B3%95%E7%9A%84%E6%B5%81%E7%A8%8B
[6]https://blog.csdn.net/fw0124/article/details/40983787: https://blog.csdn.net/fw0124/article/details/40983787
[7]https://chziyue.com/post/57.html: https://chziyue.com/post/57.html




