Scu_laji

使用wireshark私钥方式解密https流量

使用wireshark私钥方式解密https流量

最近在公司开发项目时,需要查看某环境下的https报文,有服务器的控制权,但是不是很方便改成http格式的。

由于是服务内部的互相调用,也不适合使用浏览器导出logfile的方式。

折腾了半天时间,在此做个总结。

  1. 现有的https加密方式按照解密难易可分为Diffie–Hellman算法和其他算法, 由于Diffie–Hellman的实现逻辑与RSA类似,所以很难破解,即使你有网站的私钥也不行。
  2. nginx配置有点坑。
  3. openssl恶心

first step: 确认加密算法

首先, 这并不是一篇入门的小白文,我不会在这里教你如何去抓包啥的。

第一步,抓到流量包之后使用wireshark打开,然后找到你的第一个client Hello包,向下翻翻找到server Hello包。

然后找找这里的Cipher Suite就能知道用的什么加密方式了。如果你很不幸的在这里发现了ECDHE或者DHE的字样,那么可以确认服务器与客户端之间采用的是Diffie–Hellman算法,这也意味着你即使拥有私钥也做不了解密报文的事,如果这里没有ECDHE或者DHE, 你可以直接跳到第三节

关闭Diffie-Hellman算法

这里以nginx举例,在nginx有关于ssl的配置选项中有几个有意思的配置项.

  • ssl_protocols
  • ssl_prefer_server_ciphers
  • ssl_ciphers

第一项ssl_protocols的意思是指定使用的ssl加密算法版本, 一般来说有如下几种。

1
2
3
4
5
TLSv1.2
TLSv1.3
TLSv1.1
TLSv1.0
SSLv3 已弃用

第二个选项告诉服务器倾向于选择服务器提供的加密方式,可以避免TLS降级攻击。

第三个选项ssl_ciphers此选项就是我们这次需要重点关注的选项了,里面定义了当前服务器支持的加密方式。

我们在此将里面所有的出现ECDHE,DHE字样的加密方式全部删掉即可。

重启nginx.

配置站点证书以解密https流量

从网站nginx配置文件中找到证书key文件,拖下来。注意确定一下一定要是PEM格式的证书key才可以,其他的证书key可以使用openssl转换成PEM格式的证书key。

然后打开偏好设置, 选择wireshark协议中的ssl(有的版本可能叫TLS)

点击这里的Edit

一般来说都是不需要填password的。

点击ok,让wireshark重新分析一下数据包,这时大概率就能获取到你的https明文数据了。

debug 篇

第二步nginx重启时报错

1
nginx: [emerg] SSL_CTX_set_cipher_list("TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256") failed (SSL: error:1410D0B9:SSL routines:SSL_CTX_set_cipher_list:no cipher match)

此时需要确认一下你的openssl版本并确认openssl支持以上至少一个加密参数。

1
2
openssl ciphers -v 'TLS13-AES-128-GCM-SHA256'
openssl ciphers -v

如果不支持,随便找一个支持的版本填进去,最好选择客户端也支持的版本。

还是抓不到明文怎么办

  1. 确认一下你的包内有完成的client hello,server hello的ssl握手过程,如没有,尽量延长抓包时间。
  2. 确认一下server hello的握手包已经成功回退到不支持Diffie–Hellman算法的版本。