Wireshark 的抓包是直接读取并分析网卡数据,要想让它解密 HTTPS 流量,有两个办法:
1)如果你拥有 HTTPS 网站的加密私钥,可以用来解密这个网站的加密流量;
2)某些浏览器支持将 TLS 会话中使用的对称密钥保存在外部文件中,可供 Wireshark 加密使用。
先来查看下第一种方法:
Tips:这里我用一个公司的域名和证书,使用本地的Hosts解析到内网一台Nginx服务器之上。
服务端Nginx配置:
cd /data/nginx/conf vim vhosts/tempused.conf
# Nginx Second Configure File. # 测试Wireshark抓取固定站点HTTPS流量 server { listen 80; listen 443 ssl; server_name shopc.xxxxx.com; ssl_certificate certs/xxxxx.com.pem; ssl_certificate_key certs/xxxxx.com.key; access_log logs/shopc_access.log; error_log logs/shopc_error.log; location / { root "/data/www"; } }
mkdir /data/www echo '<h1>this is a test page!</h1>' > /data/www/index.html systemctl reload nginx
客户端Host配置:
... 172.16.220.128 shopc.xxxxx.com
测试访问:
可以正常到达内网服务器。
此时Wireshark抓包查看:
可以看到,在SSL/TLS握手,密钥交换完成后,开始发送真实数据(Application Data),它们使用“协商”密钥进行加密通讯(大部分网站都会使用密钥交换技术生成临时随机的对称密钥来代替RSA非对称密钥进行数据通讯)。
故要想看到其内容,需使用第二种方法得到浏览器交互时生成的协商密钥进行解密。
故下面为展示设置,没有密钥交换情况下设置查看。
Wireshark设置:
右键点击进入TLS协议首选项中的RSA keys list
在其中添加对应的证书密钥:
想要获得数据包中TLS中的加密数据,需要系统和浏览器的配合。
首先打开“系统属性”选项卡:可以通过右键“我的电脑”——“属性”——“高级系统设置”打开;也可以通过在运行中输入“systempropertiesadvanced”打开。
然后添加环境变量SSLKEYLOGFILE:
变量值的文件路径可以自己设置。保存好之后,可以通过cmd命令行来查看其生效:
设置这个环境变量是因为:Firefox 和 Chrome浏览器会在系统环境变量中存在 SSLKEYLOGFILE 路径时生成该文件,以记录TLS 会话中使用的对称密钥。
注意:如果你的浏览器是以非管理员权限运行的,请将上述文件设置到有权限写入的目录中。
设置完成之后完全关闭并重新打开 Chrome 浏览器生效,可以看到所设置的路径下自动生成了记录文件:
Wireshark设置,同样进入TLS协议首选项,设置Pre-Master-Securet log file:
将文件路径设置为上面环境变量的路径:
之后,重新抓包并访问就可看到加密内容: