最近排查网页接口时,我重新整理了一套用 Wireshark 抓取 HTTPS 流量的流程。普通抓包只能看到 DNS、IP、TLS 握手和包大小;如果想看到 HTTPS 里的请求路径、请求头和响应内容,还需要配合浏览器导出的 TLS key log。
适用场景
这套方法适合这些场景:
- 想确认浏览器有没有真正访问某个域名。
- 想看网页发起了哪些 HTTP/2 请求。
- 想分析 DNS、TLS 握手、连接失败、重传和延迟问题。
- 想把某个网站的相关流量导出成
.pcapng给别人分析。
注意:只能分析你自己设备、自己账号、自己有权限访问的流量。抓包文件和 TLS key log 可能包含 Cookie、Token、请求体、账号信息,不要随便分享。
安装 Wireshark
macOS 可以直接从官网下载安装:
https://www.wireshark.org/download.html
安装时如果提示安装 capture helper 或 ChmodBPF,建议允许安装,否则可能没有权限抓取网卡流量。
第一步:选对网卡
打开 Wireshark 后,首页会列出多个网卡。macOS 常见网卡如下:
| 网卡 | 常见用途 |
|---|---|
en0 |
Wi-Fi |
en1 / en5 / en6 |
有线网卡、USB 网卡、扩展坞 |
lo0 |
本机回环地址,也就是 localhost |
最简单的判断方法:看哪个网卡右侧有实时波形。访问网页时波形明显变化的,通常就是当前正在使用的网卡。
第二步:先抓普通 HTTPS 流量
双击网卡开始抓包,然后在浏览器里打开目标网站。比如:
https://www.boboidea.com/
打开后回到 Wireshark,先用 DNS 过滤:
dns.qry.name contains "boboidea.com"
如果能看到记录,说明浏览器发起过域名解析。
再用 TLS SNI 过滤:
tls.handshake.extensions_server_name contains "boboidea.com"
如果能看到记录,说明抓到了访问这个域名的 TLS 握手。
如果 DNS 和 TLS SNI 都没有结果
常见原因有几个:
- 抓错了网卡。
- 浏览器或系统已经缓存 DNS。
- Chrome 开启了安全 DNS,也就是 DoH。
- 网站走了 HTTP/3/QUIC。
- 抓包开始前连接已经建立了。
可以先在终端查目标 IP:
dig +short www.boboidea.com
然后在 Wireshark 里按 IP 过滤:
ip.addr == 目标IP
如果怀疑是 QUIC,可以看 UDP 443:
udp.port == 443
为了方便分析 HTTPS,建议临时关闭 QUIC,或者用命令启动 Chrome:
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-quic
第三步:配置 TLS key log 解密 HTTPS
普通 HTTPS 抓包只能看到:
TLSv1.3 Application Data
如果想在 Wireshark 里看到 HTTP/2 请求,需要让 Chrome 把 TLS 会话密钥写入文件。
先彻底关闭 Chrome:
pkill -x "Google Chrome"
然后用环境变量启动 Chrome:
SSLKEYLOGFILE=$HOME/Desktop/sslkeys.log /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-quic
打开目标网站后,检查文件是否生成:
ls -lh ~/Desktop/sslkeys.log
如果没有生成,可以先手动创建:
touch ~/Desktop/sslkeys.log
chmod 600 ~/Desktop/sslkeys.log
然后重新用上面的 SSLKEYLOGFILE=... 命令启动 Chrome。
第四步:在 Wireshark 里引入 key log
打开 Wireshark 设置:
Wireshark -> Settings -> Protocols -> TLS
找到:
(Pre)-Master-Secret log filename
填入完整路径:
/Users/你的用户名/Desktop/sslkeys.log
不要写 ~/Desktop/sslkeys.log,有些 GUI 不会展开 ~。
设置完成后,重新开始抓包,并且必须使用刚才通过 SSLKEYLOGFILE=... 打开的那个 Chrome 访问网站。
第五步:确认是否解密成功
抓包后可以过滤:
http2
如果能看到 HyperText Transfer Protocol 2,说明解密成功。
常见字段包括:
:method
:scheme
:authority
:path
user-agent
content-type
也可以过滤某个域名:
http2.header.value contains "boboidea.com"
如果仍然只能看到:
TLSv1.3 Application Data
通常是下面这些原因:
- Chrome 不是通过
SSLKEYLOGFILE=...启动的。 - Wireshark 里 key log 路径填错了。
- 抓包开始前 TLS 连接已经建立。
- Chrome 走了 HTTP/3/QUIC。
- 使用的不是 Chrome/Chromium,或者浏览器不支持 key log。
常用过滤器
DNS:
dns
某个域名的 DNS:
dns.qry.name contains "example.com"
TLS SNI:
tls.handshake.extensions_server_name contains "example.com"
某个 IP:
ip.addr == 1.2.3.4
HTTPS 端口:
tcp.port == 443
HTTP/2:
http2
HTTP/3 / QUIC:
quic || http3 || udp.port == 443
TCP 重传:
tcp.analysis.retransmission
导出给别人分析
如果抓包文件太大,不要直接发完整文件。可以先过滤出目标流量:
dns.qry.name contains "boboidea.com" || tls.handshake.extensions_server_name contains "boboidea.com" || ip.addr == 目标IP
然后导出当前显示的包:
File -> Export Specified Packets -> Displayed
保存为 .pcapng。
如果要让别人解密 HTTPS,还需要同时提供 sslkeys.log。但这个文件非常敏感,能解密对应抓包里的 HTTPS 内容,除非完全信任对方,否则不要分享。
注意事项
sslkeys.log不是自动存在的,只有用SSLKEYLOGFILE=...启动浏览器后,新建 HTTPS 连接时才会写入。- 已经打开的旧 Chrome 窗口不会自动开始写 key log。
- 已经建立的 TLS 连接不会补写历史密钥,最好重新打开页面。
- 抓包文件可能包含账号、Token、Cookie、请求体,导出前要确认范围。
- 分析第三方网站时,只做自己设备上的调试,不要尝试绕过授权或抓取他人数据。
一句话总结
用 Wireshark 看 HTTPS,普通抓包先用 DNS、TLS SNI 和 IP 确认有没有抓到;如果要看 HTTP/2 明文内容,就用 SSLKEYLOGFILE 启动 Chrome,并在 Wireshark 的 TLS 设置里引入 sslkeys.log。