使用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

下面是命令的输出数据:

可以看到curlexample.com建立了一次https通信。此时我们查看之前设置的SSLKEYLOGFILE,也就是/tmp/sslkey.log这个文件的内容:

可以看到在通信过程中,curl把session key导出到了文件里,叫做CLIENT_RANDOM。这样,wireshark通过读取这个session key,就可以解密捕获的ssl数据了。

本文的上篇就讲解到这里,在下篇继续介绍wireshark这边的使用方法。

参考资料

My Github Page: https://github.com/liweinan

Powered by Jekyll and Theme by solid

If you have any question want to ask or find bugs regarding with my blog posts, please report it here:
https://github.com/liweinan/liweinan.github.io/issues