QUIC抓包全是密文,三种解密方案对比,附Charles/Wireshark避坑指南

120 阅读6分钟

开发同学应该都遇到过这种情况:App 的请求全面切到 HTTP/3 之后,Charles、Fiddler 里一片安静——一条流量都看不到。那段时间我排查一个接口问题,靠老办法死活看不到请求,折腾下来才把 QUIC 抓包解密的路数摸清:它跟传统抓包的思路完全不同,但有三条路都能拿到明文。这篇按原理、实操、常见问题、工具对比展开。

先讲原理:QUIC 跑在 UDP 上,握手阶段用 0-RTT/1-RTT 交换密钥,数据全程加密。传统代理抓包工具在 TCP 层做中间人——客户端走 HTTP 代理建隧道、工具在隧道口换证书解密——这套机制对 QUIC 完全失效:流量根本不走 TCP,隧道建不起来,中间人没有位置。Wireshark 这类网卡工具能看到 QUIC 包,但默认是密文,解密又依赖客户端导出密钥。所以 QUIC 抓包难在两头:接入层不对、密钥拿不到。

补充两个可验证的细节:QUIC 的握手把传输与加密协商合并在一起,0-RTT 让恢复连接的第一包就能带数据,整个会话的密钥都在端侧生成——中间人既插不进握手,也拿不到密钥;QUIC 默认跑在 UDP 443 上,抓包时按 UDP 过滤就能看到它的包,但看到包和解开内容是两回事。

为什么 QUIC 抓不到包?

先回答最常问的:不是工具坏了,是接入方式不匹配。代理抓包依赖 HTTP 代理协议,QUIC 流量不经过它;UDP 流量网卡工具能看到但解不开。判断方法:抓包工具里请求列表为空,但 App 功能正常,同时系统或 App 设置里 HTTP/3 是开启状态——基本可以确定流量走了 QUIC。再补一个验证动作:在 App 的调试设置里临时关掉 HTTP/3 或 QUIC 开关,如果流量立刻出现在代理工具里,就能坐实之前是 QUIC 挡住了。

怎么让流量重新可抓?

第一条路:让目标 App 从 HTTP/3 平滑回退到普通连接(HTTP/2 或更早)。回退之后流量重新走 TCP、走代理,中间人机制恢复,抓包解密照常工作。这个过程对 App 透明,停止会话后自动恢复,不影响 App 之后的正常使用。适合场景:App 支持协商回退、临时环境排查,改动最小。

操作上不用改 App 代码:网卡抓包提供让目标从 HTTP/3 平滑回退的开关,开启后目标 App 的请求回落为普通连接,重新可抓可解密;排查完停止会话,回退自动解除。想验证回退是否生效,看抓到的连接协议版本——出现 HTTP/2 而不是 h3,就说明回落成功。

网卡层能直接抓 QUIC 吗?

第二条路:网卡层直接抓 UDP 全量流量。QUIC 跑在 UDP 上,网卡抓包不做中间人、不改系统设置,UDP 流量原样收进来。TraceEagle 的网卡抓包配合自动解密能力,常见程序抓到即明文;不能自动解的,手动点"解密此程序",支持多个程序同时解。 网卡抓包

验证方法:开抓后让 App 产生请求,请求列表里出现 UDP 相关的连接记录;逐包视图里能看到 QUIC 帧,连接视图里能看到重组后的 HTTP/3 会话。流量多了用预设过滤(QUIC、UDP)收窄范围。

拿到密钥怎么直接解?

第三条路:拿到会话密钥直接解 QUIC/HTTP/3。密钥来源按场景分:自己的客户端可以配置导出密钥(SSLKEYLOGFILE 的思路),第三方 App 拿不到时,靠自动解密引擎处理。网卡抓包对已抓的 QUIC 流量,拿到密钥即可直接解密看明文,不依赖回退。密钥就位的标志:解密后的内容直接可读,响应体自动解压、JSON 自动美化,和普通 HTTPS 抓包后的视图一致。

问:QUIC 抓包解密一定要客户端配合吗? 答:不一定。三条路里"降级抓"和"网卡自动解密"不需要客户端配合;只有"拿密钥直接解"这条,自己的客户端主动导出密钥会更快,第三方 App 则靠自动解密引擎。

问:Wireshark 能解 QUIC 吗? 答:新版 Wireshark 支持 QUIC 解析,但解密需要密钥日志,客户端不导出就解不开。配合网卡抓包把解密密钥随流量注入,转给 Wireshark 打开即明文。

问:降级抓会影响线上流量吗? 答:只影响调试会话本身,停止后自动恢复 HTTP/3,App 后续正常使用不受影响。

把几类工具放一起看 QUIC 的应对:

  • Charles、Fiddler:代理类工具,HTTP/2 及以下场景成熟好用;HTTP/3 流量进不来,需要先降级再抓
  • Wireshark:网卡工具,QUIC 包能解析,解密依赖密钥日志;专业逐包分析场景不可替代
  • TraceEagle:网卡抓包支持 QUIC 全量抓取和自动解密,App 不配合时走降级抓,拿到密钥也能直接解 H3——三条路按场景选

实际排查里常见组合是:先用网卡抓包确认 QUIC 流量存在,再决定降级还是解密钥——工具之间是配合关系,不是替代关系。

QUIC 抓包解密的本质是绕开"中间人"这个前提:要么把流量拉回 TCP 让中间人恢复,要么在网卡层拿到全部流量自己解密——两条路都不依赖代理协议。

把三条路的时间成本摆一下:降级抓改动最小,适合先确认问题是不是 QUIC 引起;网卡自动解密零依赖,适合日常排查;密钥直解最彻底,适合自己的客户端长期调试。先降级确认,再按需加深——大多数排查在第二路就完成了。

QUIC 抓包难,难在它把代理抓包的两个前提同时拆掉了:不走 TCP、不配合密钥。对应的解法也就顺着这两个前提展开——降级抓恢复可代理的形态,网卡抓包绕开代理协议本身,密钥直解对付最彻底的加密。三条路不是互斥的,按手头条件选:能协商回退就降级,要零改动就网卡,自己客户端就导出密钥。HTTP/3 时代抓包,思路从"让流量走代理"换成"在正确的层级拿数据",问题就解了一半。