[https][tls] 如何使用wireshark查看tls/https加密消息--使用keylog

时间:2023-03-10 03:17:03
[https][tls] 如何使用wireshark查看tls/https加密消息--使用keylog

姊妹篇:

[ipsec][strongswan] 使用wireshark查看strongswan ipsec esp ikev1 ikev2的加密内容

[https][tls] 如何使用wireshark查看tls/https加密消息--使用私钥

需求

学习SSL/TLS的过程中, 使用wireshark转包分析,是常用的手段.

我自建nginx自签名证书, 抓了一个访问请求的包, 是这样的.

[https][tls] 如何使用wireshark查看tls/https加密消息--使用keylog

我们可以看到, 从第8个包开始, 便出现了密文. 即使我不关心TLS上层的业务内容, 第八和第九个包里边的最后两段加密数据段, 也是需要关心的. 他们是Finshed报文,是协商报文的一部分.

配置

wirshark

我们知道wireshark具体解密TLS密文的能力. (我们当然知道, 因为我们经验丰富), 而且我们还知道从下边的这个地方进行配置:

edit->preferences->protocols->tls

[https][tls] 如何使用wireshark查看tls/https加密消息--使用keylog

情况A: 当我们使用RSA进行秘钥交互的时候, 就对RSA keys list项进行配置, 导入server端的私钥.

情况B:  当我们使用DH进行秘钥交互的时候, 就对Master Secret log filename进行配置, 导入单次会话的主密钥.  因为DH的秘钥交互过程是明文交互的, 所以只配这个,也能解开全部的密文.

curl或firefox

情况A并没有这个步骤. 下面讨论情况B

wireshark的配置中需要的配置文件, 是用来保存主秘钥的. 称为 SSLKEYLOGFILE

在通过curl或firefox访问之前, 设置环境变量SSLKEYLOGFILE的值为目标文件, 在执行过curl或firefox之后, 主密钥会被自动记录到该文件中, 如下以curl为例, firefox同样适用:

┬─[tong@T7:~/Works/tls]─[:: PM]
╰─>$ export |grep SSL
SSLKEYLOGFILE /home/tong/Works/tls/keylog
┬─[tong@T7:~/Works/tls]─[:: PM]
╰─>$ curl --cacert ~/Keys/https/root/root.cer https://TTTrust:443/

可以看到该文件的内容:

┬─[tong@T7:~/Works/tls]─[:: PM]
╰─>$ cat keylog
CLIENT_RANDOM db23bf9a63b494ba72ecfaef831f55954f887576xxxxa2c45e46e7f631ea160d bfc5346bb7c0573b95e637a973524884ec912b67d5ce747c1a169e1d6ba57643ff8a1e97b33b11c5d6ff249961efxxxx

效果

现在, 按前文配置该文件在wireshark中, 可以看见下面的效果:

协商包与数据包都被解开了.

[https][tls] 如何使用wireshark查看tls/https加密消息--使用keylog

参考

<<everything curl>>是curl主页上推荐的官方书面, 其中一个章节讲述了以上方法

https://ec.haxx.se/tls-sslkeylogfile.html