使用wireshark对https通信进行数据捕获(上)
要想使用wireshark对ssl通信进行侦听,需要wireshark能够拿到session key。因为ssl通讯是加密的,所以wireshark必须要有加解密的钥匙,也就是session key。首先讲解一下原理概念。
原理讲解
关于ssl通信,其核心就是两个阶段:
第一阶段,公钥加密,传递关键信息(如果需要验证身份就传证书验证身份,如果不需要验证身份就直接传递第二阶段需要的密钥)。
第二阶段:对称加密算法,通过第一阶段的,安全的加密方式得到的key,建立好对称加密算法(因为密钥已经两边都有了,此时用就好了,不再需要传递钥匙)。
所以对于wireshark来讲,拿到第二阶段「对称加密」算法所使用的密钥就可以了,也就是「session key」。
因为这个「session key」,是「客户端」与「服务端」之间协调确定的,并且是通过「非对称」加密的信道来传递的,所以外部是无法拿到的,必须是「客户端」主动把这个key保存在一个地方,wireshark才能读取到。整个架构如下图所示:
所以,如果wireshark想捕获ssl通信内容,关键是得到「session key」。而这个「session key」,是需要「客户端」跟「服务端」协调好,确定下来以后,「客户端」主动给出来给wireshark来使用,wireshark才可以拿到的。因为拥有了「session key」,对本次「客户端」和「服务端」的通讯数据就可以完全的解密了。
以下是「session key」被wireshark使用的场景说明:
以上是对整个侦听机制的说明,接下来看一下具体的操作流程。
流程说明
为了有一个统一的导出「session key」的机制,各种客户端共同约定一个环境变量叫做SSLKEYLOGFILE
:
$ export SSLKEYLOGFILE=/tmp/sslkey.log
一旦设置了这个环境变量,那么客户端的工具就会把访问过程中,和服务端约定好的session key
保存进去。比如curl
作为客户端工具,就支持这个环境变量。我们可以设置好上面的变量以后,使用curl访问一个https
的网站:
$ curl -v https://example.com | head
下面是命令的输出数据:
可以看到curl
与example.com
建立了一次https通信。此时我们查看之前设置的SSLKEYLOGFILE
,也就是/tmp/sslkey.log
这个文件的内容:
可以看到在通信过程中,curl
把session key导出到了文件里,叫做CLIENT_RANDOM
。这样,wireshark通过读取这个session key,就可以解密捕获的ssl
数据了。
本文的上篇就讲解到这里,在下篇继续介绍wireshark这边的使用方法。
参考资料
- SSLKEYLOGFILE
- SF18US - 35: Examining SSL encryption/decryption using Wireshark (Ross Bagurdes) - YouTube
- Decrypting TLS Browser Traffic With Wireshark – The Easy Way!
- 上一篇 在js环境下使用node-rsa操作rsa密钥
- 下一篇 使用sed往文件里添加内容