暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

抓包分析HTTPS理论落地

小马爸爸的笔记 2020-08-12
452

抓包分析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]

 其他参考资料:

  1. https://www.thesslstore.com/blog/explaining-ssl-handshake/#diffie-hellman-authentication[2]
  2. https://www.cnblogs.com/fishou/p/4206451.html[3]
  3. https://chziyue.com/post/57.html[4]
  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]
  5. https://mp.weixin.qq.com/s/5MB_9HmhUhDshbgTUKJgsg
  6. 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/

疑问

  1. DH算法加密中需要模数和基数,这两个参数在哪里传递? 由于这里使用的是ECDHE算法,参数可能不一样,可以参看另外一篇文章里面有抓DH的包。

https://blog.csdn.net/fw0124/article/details/40983787[6]

 抓包截图如下:

 ECDHE算法参数可参考这里:https://chziyue.com/post/57.html[7]

参考资料

[1]

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


文章转载自小马爸爸的笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论