WireShark解密HTTPS流量

2023-11-02 08:27:27 浏览数 (2)

协议介绍

HTTPS(Hypertext Transfer Protocol Secure)是一种基于传输层安全协议(TLS)的HTTP协议扩展,它为Web客户端和服务器之间的安全数据传输提供了保护,HTTPS协议之所以是安全的是因为HTTPS协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现,其实HTTPS在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段,我们可以将HTTPS理解为安全版HTTP(即HTTPS=HTTP SSL/TLS),下面我们将HTTPS的整体过程分为证书验证和数据传输阶段,具体的交互过程如下(原图来自@HYN):

证书验证阶段:

  1. 浏览器发起HTTPS请求
  2. 服务端返回HTTPS证书
  3. 客户端验证证书是否合法,如果不合法则提示告警

数据传输阶段:

  1. 证书验证合法后在本地生成随机数
  2. 通过公钥加密随机数并把加密后的随机数传输到服务端
  3. 服务端通过私钥对从客户端传递过来的随机数进行解密
  4. 服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输
数据传输

HTTPS协议中数据传输使用对称加密是因为非对称加密的加解密效率是非常低的,而HTTP的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受的,另外在HTTPS的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以HTTPS中内容传输加密采取的是对称加密,而不是非对称加密:

报文抓取

在这里我们通过Web浏览器访问163邮箱并进行登录认证,同时使用wireshark进行抓包操作

我们从捕获的数据包中过滤出所有和mail.163.com相关的数据包,可以看到使用https后通信报文直接已做加密处理,无法直接查看具体的报文信息

报文解密1

Chrome浏览器支持将TLS会话中使用的对称密钥保存在外部文件中,由此便可以用于Wireshark解密数据使用,具体流程如下:

Step 1:配置系统环境变量

  • 变量名:SSLKEYLOGFILE
  • 变量值:路径可以随意指定,其主要作用是告诉Chrome输出SSLKEY的位置,而Wireshark则可以使用此文件来解密HTTPS数据包

Step 2:配置Wireshark,在下面的选项中填入刚才在系统变量指定的keylog文件的存储路径以便wireshark可以访问keylog中的key来解密https数据包

  • 中文:编辑 > 首选项 > protocols > ssl (最新版wireshark已经将SSL改为TLS,其实ssl/tls都已统称通信加密协议)
  • English:Edit > Preferences > protocols > ssl (最新版wireshark已经将SSL改为TLS,其实ssl/tls都已统称通信加密协议)

Step 3:打开Chrome的开发者模式(在该模式下才会记录TLS密钥到keylog文件中)

Step 4:再次访问163邮箱并进行登录操作,同时使用wireshark抓包

之后成功解密数据报文

报文解密2

如果我们可以从服务器上导出带私钥的P12格式的证书或者直接导出服务器的私钥,那么我们可以直接在wireshark中加载证书实现解密操作,下面时初始捕获从TCP三次握手开始的完整报文,可以看到此时的报文是被TLS加密的,无法看到具体的报文内容:

此时我们只需要点击编辑—>首选项—>协议—>SSL(有的版本只有TLS)导入RSA key

由于通过DH方法交换的密钥不会在中间传递,所以这种方法只能解密通过RSA交换的密钥,导入服务器证书:

点击OK后,Wireshark会对捕获的报文进行解密,之后可以看到报文被成功解密,此时可以直观的看到HTTP报文的请求和响应

文末小结

本篇文章注意介绍了HTTPS数据报文在wireshark中的两种解密方式,其中日志解密方式较为通用,RSA证书的解密则需要获取服务器端的证书信息,较为困难

0 人点赞