websockets通信抓包如何解密咧

背景:

使用libwebsockets作为客户端访问ASR/TTS websockets服务器, 由于使用SSL加密, tcpdump捕获的报文需要解密.

解决依据:

  1. 通过wireshark官方文档TLS解密知, wireshark解密TLSv1.3只能通过获取(Pre)-Master Secret方式.另外:
  • OpenSSL 1.1.1 and after 可以设置libssl回调函数 SSL_CTX_set_keylog_callback 获取.

  • OpenSSL 1.1.0 and before 可以使用 LD_PRELOAD libsslkeylog.so 获取.

  1. 如果编译libwebsockets.so时链接了静态的libssl.a和libcrypto.a, 没有链接libssl.so动态库, 则无法通过LD_PRELOAD的方式获取(Pre)-Master Secret.

  2. 通过libwebsockets官方仓库issue知, 可以使用lws_klog_dump捕获打印(Pre)-Master Secret到环境变量SSLKEYLOGFILE设置的文件里.
    但是此功能只在main分支及4.5.x分支.

操作步骤:

# 设置环境变量
echo "export SSLKEYLOGFILE=/opt/tls.keys" 

# 确认环境变量在进程内生效
cat /proc/pid/environ  | tr '\0' '\n' | grep SSLKEYLOGFILE

# 进行抓包并下载文件
tcpdump -s 0 -i any '(src port 8001 || dst port 8001)' -w /opt/tts.pcap
下载/opt/tls.keys和/opt/tts.pcap到本地

处理结果:

1.使用wireshark打开tts.pcap, 并过滤tls报文.

2.点击wireshark—编辑—首选项—协议—TCP—选中Reassemble out-of-order segments, 点击确定

3.点击wiershark—编辑—首选项—协议—TLS(Protocol name is SSL before Wireshark 3.0.)—(Pre)-Master-Secret选中tls.keys, 点击确定

即可正常解密.

Comments