wireshark如何抓取WebSocket数据包

前文

WebSocket目前在web端使用广泛,可以使用websocket来传输数据,解决了web端无法跟服务器维持高效的长链接的问题。什么是websocket呢?websocket是一种浏览器与服务器进行全双工通讯的应用层协议。它基于 TCP 传输协议,并复用 HTTP 的握手通道,可以在浏览器里使用,支持双向通讯。
本文来讲述一下如何通过wireshark来抓取websocket数据,进行协议分析。

配置

要使用wireshark抓取websocket包,需要注意一点,wireshark无法解析https协议,如果你的websocket使用的wss,就需要配置wireshark的tls解析,本文使用的是mac,会基于mac讲解如何配置tls解析。
目前chrome和firefox都支持将https的对称秘钥保存到日志文件中,前提是需要设置SSLKEYLOGFILE系统变量。目前Wireshark 1.6.0及更高版本可以使用这些日志文件来解密数据包。

SSLKEYLOGFILE设置

  1. 创建sslkeylog文件
  2. 设置环境变量SSLKEYLOGFILE,打开.zshrc文件,添加如下:export SSLKEYLOGFILE=~/sslkeylogfile/keylogfile.log
  3. 打开浏览器,访问任意https://xxx.com
  4. 打开keylogfile.log,观察对称秘钥是否写入:通过上图可以观察到,秘钥已经写入日志文件,这个时候wireshark就可以使用秘钥文件,进行解密了。
    这里需要注意,我们需要在终端模拟器启动浏览器,否则,我们无法获取对称秘钥,需要我们在.zshrc文件配置chrome的快捷启动配置见下:
    alias chrome="open -a 'Google Chrome'" termial启动浏览器,输入chrome,就可以启动浏览器了。

wireshark配置

打开wireshark,wireshark->preferences->protocols->tls,见下图:

wireshark会丢包吗 wireshark wss_wireshark会丢包吗


参照上图,配置上前面配置的keylogfile.log文件

验证

在wireshark的filter中输入websocket,启动抓包,会抓取websocket的包

抓包截图见下:

wireshark会丢包吗 wireshark wss_日志文件_02


可以看到我们已经可以正常抓取websocket包了。如果想看到完整的websocket交互,包括连接建立等,可以参照下图配置:

wireshark会丢包吗 wireshark wss_wireshark会丢包吗_03

追踪TLS流,可以看到完整的交互。