资讯动态

Wireshark-GM实战:解密国密SSL/TLS流量的抓包分析指南

发布时间:2026/10/20 14:05:55 来源:尧图企业网站定制
1. 为什么需要 Wireshark-GM标准版抓国密流量时的真实痛点1.1 国密SSL套件与标准Wireshark的兼容性差距先聊一个很多搞网络的人可能都撞见过的情况拿一台装好普通 Wireshark 的电脑跑到某个金融、政务或者能源行业的内网环境里对着一个所谓的“国密改造”系统抓包。抓回来的包打开一看TLS 握手还是正常走可到 Cipher Suite 那一栏就全懵了标准 Wireshark 根本不认识TLS_ECC_SM4_CBC_SM3、TLS_ECC_SM4_GCM_SM4这类套件显示的全是Unknown证书里的 SM2 公钥、SM3WithSM2 签名算法也解析不出来再往后报文几乎全是Encrypted Application Data基本没法往下看。这就是我后来接触到 Wireshark-GM 的原因。Wireshark-GM 并不是 Wireshark 官方出的版本也不是什么凭空冒出来的新工具它是社区和企业里针对国密算法SM2/SM3/SM4做了协议识别和密钥交换解析优化的 Wireshark 定制分支很多内部技术团队把它编译好之后放到各自资源站里供同事下载叫着叫着就把它叫成了“Wireshark-GM”。这个分支解决的核心问题说穿了就一件事让抓包分析工具能认出、能解开走国密密码套件的 SSL/TLS 流量。普通 Wireshark 之所以搞不定国密流量根本原因在协议栈与算法库的配合。官方主线对 TLS 支持的底层实现主要围绕国际主流密码算法拿到 SM 系列套件时没有对应的套件 ID 映射、没有密钥交换的参数识别逻辑、也没有 SM4 记录层解密所需的算法注册自然就出现了“握手还能看个大概、应用数据完全打不开”的尴尬状态。而 Wireshark-GM 在识别和解析两个层面都做了针对性适配这正是它跟主线版本最本质的差别。1.2 业务中哪些场景最容易碰上国密协议我不是在大城市写字楼里远程敲键盘写这篇东西的这几年跑过的现场里国密流量的出现频率其实比很多人想象的高得多。最常见的场景是银行、证券、政务大厅这类要过国密改造的内网业务系统。这些系统的前端网关做了国密 TLS 卸载用户侧装的是带国密算法的专用浏览器或厂商定制内核你随便打开一个业务页面的开发者工具看到的加密套件列表就全部是 SM 系列跟外面普通网站的 TLS 1.2/1.3 完全不是一个谱系。第二个高频场景是物联网平台与工业控制系统的加密通信。一些现场终端和采集网关之间跑的是基于 SM 算法的私有 TLS 握手不重新封包看协议细节的话连“这个包是握手还是应用数据”都很难分辨。第三个常见场景是安全测试和应急排查。单位内部做风险评估时需要对国密加密链路做中间人分析或者应用层协议还原如果抓包工具本身不认识国密流量后面做告警分析、内容审计都会卡在这一层。这些场景里真正卡人的不是“抓不到包”而是“抓到了但看不懂”。普通 Wireshark 只能把密文摆在你面前而你需要的恰恰是看到密文底下的 HTTP 请求、登录报文、或者某个 API 的返回内容。Wireshark-GM 的价值就在这里它把本来藏在密文里的东西重新拉到明面上来。1.3 什么人该用、解决了什么具体问题如果你手头要调试一个国密 HTTPS 网关、需要分析某国产浏览器与服务器之间的 TLS 握手参数、或者只是想验证内网某个国密加密链路是否符合预期那这个版本就很值得装上。它适合三类人一是负责国密改造落地的网络工程师二是做加密流量分析的安全运维人员三是需要对国密协议细节做研究的测试开发。装了 Wireshark-GM 之后至少能解决三件标准版解决不了的事第一正确显示国密套件名称和握手参数不让Unknown遍地开花第二结合 SSLKEYLOGFILE 密钥日志解密密文把应用层明文还原出来第三在设置好协议映射之后能让 tshark 命令行工具参与自动化分析方便脚本化处理大批量 pcap 文件。2. 安装环节从下载到跑通的第一道门槛2.1 Windows 安装包安装与抓包驱动检查Windows 是国内很多分析环境的主力系统拿到的 Wireshark-GM 也大多编译成了安装包。装的时候有几点要留心别一路“下一步”就完事。首先确认系统里有没有老版本的 WinPcap/Npcap。如果残留着旧驱动建议先把它们全部卸载干净再装新的。Windows 上 Wireshark 的抓包能力完全依赖底层驱动驱动装不好后面打开 Capture 界面会一直提示找不到接口。我见过好几个人卡在这一步界面打开正常但 Interface List 里空空如也重装了三四遍才发现是驱动被杀毒软件隔离了。安装 Wireshark-GM 的时候安装目录尽量不要放在带空格和中文的路径下。虽然新版对路径兼容性有所改善但 GM 分支里解密的临时 dll 和插件加载逻辑对路径更敏感放在C:\Program Files (x86)这种带括号的目录里有概率触发插件加载失败。我自己习惯放D:\Apps\WiresharkGM这类纯英文路径虽然涡轮加个 D 盘但能给后面排查省不少事。驱动装好后可以在 cmd 里用net start npcap看到“请求的服务已经启动”或类似提示说明内核驱动正常。然后打开 Wireshark-GM在Help - About Wireshark里看编译信息里是否有with Gcrypt或with GnuTLS同时确认主版本号下方有没有带 GM 字样或国密相关的附加字符串。这一步虽然简单但能第一时间判断你装的到底是不是 GM 分支而不是把普通版装错了。安装完成后必须做的一件事自己造一个已知的国密 pcap 来验证解析能力。可以用某国密 OpenSSL 分支的openssl s_client连一个测试服务端把抓包结果存成文件然后用 Wireshark-GM 打开看握手部分能不能正常显示套件名。这一步别省否则到了现场才发现“版本好像不对”那才是最被动的。2.2 Linux 源码编译与依赖处理在很多服务器上Wireshark-GM 没有现成的发行版软件包需要基于源码自己编译。编译本身不复杂但依赖处理得当能少踩一半以上的坑。以下是基于常见实践整理的编译步骤前提是系统已经有编译工具链# 安装基础依赖Debian/Ubuntu 系 sudo apt-get install build-essential cmake flex bison \ libpcap-dev libglib2.0-dev libgcrypt20-dev libgnutls28-dev \ qttools5-dev qttools5-dev-tools libqt5svg5-dev \ zlib1g-dev liblz4-dev libzstd-dev # 解压源码后开始构建 mkdir build cd build cmake -G Ninja \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_INSTALL_PREFIX/opt/wireshark-gm \ -DBUILD_wiresharkON \ -DBUILD_tsharkON \ .. ninja sudo ninja install-DBUILD_wiresharkON和-DBUILD_tsharkON这两个开关要留意有些精简编译脚本默认只编 tshark 或者只编图形界面你可能会需要两端都有。-DCMAKE_INSTALL_PREFIX建议用独立的目录别直接覆盖系统自带的 Wireshark避免把原来的环境搞乱。我试过混装在同一 prefix 下结果插件目录互相打架最后又把系统包重装了一遍才恢复正常。如果你的机器上安装了 GTK 版依赖库而没有 Qt5cmake 阶段会报找不到 Qt 的错误。可以直接用-DBUILD_wiresharkOFF只编译 tshark或者干脆装齐 Qt 依赖走完整界面。编译常见的报错基本都集中在找不到头文件上比如pcap/pcap.h、glib.h这类排查时先确认对应开发包是否装了通常一条apt-file search就解决了。2.3 安装后必须做的环境自检清单装好后花五分钟做一轮自检比到了现场手忙脚乱强得多。我把自检项整理成一个清单每次换新机器都会过一遍检查项预期结果说明wireshark --version版本信息含 GM 标识或国密编译宏确认是定制分支tshark -v编译参数含 Gcrypt/GnuTLS 支持命令行解密依赖这些库协议首选项搜索sm能够找到 SM 系列或国密相关字段说明协议表已加载打开已知国密 pcap在 TLS 握手树中显示ECC_SM4_CBC_SM3等具体套件名验证识别能力设置 SSLKEYLOGFILE 后解密应用层能还原出 HTTP 明文内容验证解密链路这张表里的每一项我都踩过对应的坑。比如第一项就有人以为装了 GM 包就万事大吉结果命令路径指到同事机器上的普通 Wireshark折腾半天才发现压根不在同一个安装目录里。安装这种事慢就是快每个环境都按清单走一遍才能真正把注意力放在后面的抓包分析上。3. 核心配置让 Wireshark“认识”国密流量3.1 TLS 协议首选项里的关键设置Wireshark-GM 装好之后第一步不是急着开抓包而是把 TLS 协议首选项配置到能正常解锁国密密文的状态。入口在Preferences - Protocols - TLS这里有几个关键字段。第一个是(Pre)-Master-Secret log filename。这是解密的关键后面专门用一小节讲。第二个是TLS debug file这个我建议在排查问题的时候主动开起来它会把 TLS 解析器内部处理过程写入指定文件碰到“明明有密钥日志还是解不开”的时候这个文件能告诉你解析器到底在哪个环节断掉了。很多人在网上问解密失败的问题第一句话都是“密钥日志路径我填了呀”但日志文件里可能连一条密钥记录都没读进去这种信息 debug file 一眼就能看出来。还有一个细节是TLS ports列表。如果你的国密网关跑在非标准端口上比如10443、40443或者某些动态端口一定要在列表里显式加上。否则抓到的包在 TCP 层看起来正常但 Wireshark 不知道这是 TLS 流量不会按 TLS 协议解码所谓解密更是无从谈起。我踩过一次很深的坑客户环境里网关端口是47001我照着 443 抓了半天发现全是Unknown数据后来把端口加到列表里瞬间就正常了。如果你的封装是 IP 层之上直接跑国密 TLS还要注意RSA keys list和SSL/TLS Cipher相关的字段。在 GM 定制版里这些字段通常已经内置了 SM 系列支持不需要自己往里面填。但要特别小心一点某些定制版是从 Wireshark 4.x 主线衍生的新增了一些自定义字段而不是通过偏好设置暴露的。Analyze - Reload Lua Plugins在这种场景下几乎是无效的得靠抓包验证而不是重新加载插件。3.2 SSLKEYLOGFILE 密钥日志的生成与格式密钥日志文件的机制在很多浏览器和网络工具里都有支持名字叫 SSLKEYLOGFILE平时用 NSS Key Log 格式记录会话的主密钥信息。Wireshark 读取这个文件后就能用主密钥倒推会话密钥把应用层密文解开。最直接的生成方式就是配置环境变量# Windows PowerShell $env:SSLKEYLOGFILED:\gmtest\sslkeys.log # Linux / macOS export SSLKEYLOGFILE/tmp/sslkeys.log然后正常发起 HTTPS 请求比如curl --ciphers ECC-SM4-CBC-SM3 --tls-max 1.2 https://gm.example.com/ -o /dev/null -v打开生成的sslkeys.log里面每一条记录大概是这样的格式CLIENT_RANDOM 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef 89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefCLIENT_RANDOM 后面第一位是客户端随机数第二位是服务端根据它推导出的主密钥。国密套件在这方面的整体框架和标准 TLS 1.2 有差异IETF 草案里对密钥扩展和 PRF 做了特殊处理但 Wireshark-GM 在解析这一块已经对齐能读这样的日志。真正容易翻车的是这几件事密钥日志必须在抓包的同时生成两个时间窗口对不上后面的解密就完全没戏其次路径里别带让 Wireshark 读不懂的转义字符尤其TLS debug file同时开启时如果两个路径都填到同一个文件会导致解析器读写冲突最后如果有多个客户端会话产生多条记录文件会自动追加不用担心覆盖但注意别用 Excel 打开后又存了一遍导致编码变化。对于浏览器环境Firefox 和 Chrome 原生支持SSLKEYLOGFILE环境变量国密浏览器一般也保留了这种传统机制。为了让所有走系统代理的流量都落进日志建议在启动浏览器前统一设置环境变量而不是在浏览器内部配置里找开关。国内不少基于 Chromium 内核的国密浏览器在内部配置里不一定会暴露这个选项用环境变量最省事。3.3 针对国密套件的自定义协议映射为什么不直接用普通 Wireshark 加自定义套件映射我一度也这么干过。标准 Wireshark 的 TLS 解析器支持在首选项里手工添加自定义加密套件表面上看好像能解决识别问题比如填一个0xE0开头的套件 ID 和名称但国密的难点不在“名字显示”而在“密钥交换和解密过程”。TLS 1.2 握手阶段客户端和服务端通过 ECDHE 或 RSA 交换协商出预主密钥再通过 PRF 推导主密钥国密套件在握手时所用的曲线参数、签名结构、KDF 逻辑都和国际标准不一样。Wireshark 要真正解密 SM4 记录层数据需要完整实现 SM2 密钥协商和 SM3 哈希在 PRF 中的调用光靠往自定义套件表里加一行 ID 是远远不够的。这就是为什么我始终推荐直接装 GM 定制版而不是试图在标准版里“绕”。如果你暂时拿不到 GM 版只能在普通版里硬撑我建议至少把套件 ID 对应到名称这一步做了方便看握手。方法是在 TLS 首选项的Custom TLS Cipher Suites或类似字段里追加一行0xE003 TLS_ECC_SM4_CBC_SM3 0xE011 TLS_ECC_SM4_GCM_SM4加了之后握手部分能看到套件名但解密依然没法走通。这个方案只适合临时查看握手流程不能替代 GM 版。真正的长线方案还是用编译好的 GM 定制版因为记录层解密、密钥日志对接、证书解析才能形成一条完整的链路。4. 实操演示一次完整的国密 HTTPS 抓包解密流程4.1 构造可复现的国密测试流量纸上谈兵再多不如实际抓一把包。我第一次验证 GM 版能不能用就是在一个测试环境里自己造国密流量。整体思路很简单找一个支持国密套件实现的工具或者服务端生成指定加密套件的 TLS 会话同时把密钥日志导出来。我常用的构造方式是基于国密 OpenSSL 分支 curl 组合。先把环境变量准备好export SSLKEYLOGFILE/tmp/gm_keys.log curl --ciphers ECC-SM4-CBC-SM3 --tls-max 1.2 https://gm-test-srv:443/ -k -o /dev/null -w %{ssl_verify_result}\n如果服务端没有部署国密证书-k参数可以跳过证书校验。注意--tls-max 1.2的目的是让 TLS 版本固定在 1.2因为国密套件在标准 TLS 1.3 里没有直接对应强制版本可以避免握手因为套件不匹配被拒。抓包时我通常在 Wireshark-GM 里直接选择tshark命令行抓包避免图形界面在大流量下丢帧tshark -i eth0 -f tcp port 443 -w gm_capture.pcapng开两个终端一个跑 curl另一个启动过 tshark 抓包。等 curl 请求完成按CtrlC停掉 tshark这样得到的 pcap 文件既有完整的握手包又有应用数据。构造测试流量的环节多花一分钟检查sslkeys.log是否生成了内容。如果文件是空的后面的解密演示就是白费力气。我习惯在 curl 请求之前先rm -f /tmp/gm_keys.log保证是一次干净的会话记录。4.2 解密前后的对照解读用 Wireshark-GM 打开刚才抓的gm_capture.pcapng点击任意一个 TLS 应用数据包然后到Preferences - Protocols - TLS的(Pre)-Master-Secret log filename里填入/tmp/gm_keys.log点击 OK 之后Wireshark 会自动重新解析所有相关会话。解密前后的差异非常明显下面用表格对比一下阶段协议树中的显示信息可用性解密前Encrypted Application Data, TLSv1.2只能看到 TLS 记录层长度不知道应用层是什么解密后HTTP/1.1 200 OK、GET /index.html HTTP/1.1可以按 HTTP 协议展开看到请求头、响应体握手套件TLS_ECC_SM4_CBC_SM3能直接看到 SM 系列具体参数这个对比看着简单但对刚接触的人来讲很震撼——原来密文底下真的藏着可读的 HTTP 数据。实际操作中解密之后还要注意一个细节TLS debug file 在解密期间输出太详细可能刷屏导致界面响应变慢。配置好之后我一般把它关掉只在排查问题时再开。还有一个容易被忽略的点选定一个 Application Data 包再打开首选项有时候不会触发全量重新解析尤其是旧版本 GM 分支。如果改了密钥日志路径后发现界面没有变化试试下拉菜单里View - Reload或者按CtrlShiftR强制重载我遇到过一次只有重载才能生效的情况。4.3 用 tshark 做批量抓包和解密图形界面能看流程但真正到现场处理几个 GB 的 pcap 时还是命令行高效。tshark 的 TLS 解析选项和 Wireshark 首选项是同一个底层系统可以在命令行里直接用-o参数覆盖配置。批量解密一个已有抓包文件tshark -r gm_capture.pcapng \ -o tls.keylog_file:/tmp/gm_keys.log \ -Y http \ -T fields -e http.host -e http.request.uri这条命令会把 pcap 里所有能解成 HTTP 的报文过滤出来并打印请求的主机和 URI 字段。这对快速审查国密流量里的业务访问情况很有用不用一帧一帧去看图形界面。做会话统计也是常见需求tshark -r gm_capture.pcapng \ -o tls.keylog_file:/tmp/gm_keys.log \ -z http,tree-z http,tree会输出一个按域名和 URL 分层的统计表在报告里可以直接截图或转文字。如果需要看 TLS 握手参数可以换成-z tls,或者在显示过滤里指定tls.handshake.ciphersuite字段来排序。批量处理多个文件时我习惯写一个简单的循环脚本把密钥日志路径统一进去如下for f in *.pcapng; do echo $f tshark -r $f -o tls.keylog_file:/tmp/gm_keys.log -Y http | head -20 done这种方式虽然原始但在排查一组现场抓包文件的时候非常实用能快速把有 HTTP 明文内容的文件挑出来做深度分析。5. 常见问题与排查技巧实录5.1 装了 GM 版但国密套件仍显示 Unknown这类问题通常不是版本装错了这么简单。先看Analyze - Enabled Protocols里有没有带 sm 开头的协议比如sm2、sm3、sm4相关解析器如果没有说明安装的版本确实不带国密解析能力。这种情况下只能回到源头重新找真正内置了解析器的构建版本。还有一种情况是协议树里能解析出TLS但套件 ID 显示 Unknown实际上和数据包是否完整有关。国密握手过程中如果抓包工具是在 TCP 会话中途才接入的比如错过了 ClientHello 或者 ServerHello那后续密钥交换参数对解析器来说是不完整的自然识别不出来。判断方法很简单查看会话里的ClientHello和ServerHello是否都存在只有两者齐全套件协商过程才能完整还原。我遇到过一次很诡异的情况用 GM 版打开一个 pcapClientHello 里能看到TLS_ECC_SM4_CBC_SM3但 ServerHello 里的套件却显示 Unknown后来发现是抓包过程中网卡 buffer 太小ServerHello 里的扩展字段被截断了。这种问题特征很隐蔽经手人很容易误判成版本不支持。查看 TCP 会话是否出现乱序或丢包重传是排查这类问题很关键的切入点。5.2 密钥日志填了解密出来还是密文这种“解密失败”多半是以下三件事之一密钥日志与抓包时间不匹配、密钥日志路径写错、或者 TLS debug file 显示解析器根本没读到任何记录。先检查路径。在 Wireshark-GM 的图形界面里密钥日志路径必须指向实际存在的文件如果路径里的盘符或者反斜杠写错了界面启动时会静默忽略这个错误不弹任何警告。我遇到不少同事抠了一下午日志文件最后发现路径多打了一个反斜杠。再检查时间线。如果你抓包完成后才让 curl 继续发起新会话密钥日志和 pcap 里的会话不是同一个自然解不开。解决方法是抓包和流量生成必须同时开抓包开始后再启动 curl。还有一种技术性更强的场景如果服务端开启了会话票据比如 TLS 1.3 背景下的会话恢复或者 TLS 1.2 里的 Session Ticket 扩展后续复用的会话虽然看起来还在跑国密套件但实际握手次数和主密钥推导已经变了密钥日志里的记录未必能对应上。这种时候可以强制客户端每次都用新会话比如 curl 里加--no-sessionid如果该实现支持的话排除会话复用干扰。5.3 抓大流量时丢包和界面卡顿国密网关前的流量往往不小图形界面抓包在高吞吐下很容易因为缓冲区溢出丢包或者因为大量的解密重算卡死。我的做法是优先使用命令行抓包把现场抓包和分析分离开来在现场用 tshark 抓回到办公室再用 Wireshark-GM 分析。命令行抓包时适当调大 ring buffer 尺寸tshark -i eth0 -f tcp port 443 -b filesize:102400 -b filesnum:20 -w gm_bulk.pcapng-b filesize:102400表示当单个文件达到 100 MB 时切到新文件-b filesnum:20表示只保留最近 20 个文件循环覆盖。这样做既不会因为单个文件过大导致内存吃紧又能保留足够的回溯时间。如果现场只关心握手阶段还可以用显示过滤缩小保存范围tshark -i eth0 -f tcp port 443 -Y tls.handshake.type 1 || tls.handshake.type 2 -w handshake_only.pcapng实测下来这种保存策略能在磁盘空间和会话完整性之间找到可靠的平衡点。官方文档里还有很多组合参数但我个人用最多的是上面这两组够用且稳定。5.4 分层排查思路当整个链路出问题时我喜欢用分层排查的思路避免在单一环节上消耗大量时间排查层常见现象优先检查点物理/链路层抓不到任何包抓包接口、驱动、VLAN 隔离TCP 层丢包、乱序、RST网络路径、TCP 校验和、缓冲区TLS/协议层套件 Unknown 或无法解密握手完整性、密钥日志、协议首选项应用层解开了但 HTTP 内容不全会话分段、HTTP 压缩、chunked 编码每一层都有对应的过滤器和统计工具。比如 TCP 层想知道有没有丢包用tcp.analysis.lost_segment过滤器TLS 层想看握手是否完整用tls.handshake.type分组统计。每一层都能通过 Wireshark-GM 的统计菜单快速得到数据不用靠猜。这个分层思路在国密流量上一篇特别管用因为国密加密链路的参与方比标准 TLS 多一层中间可能还有前置网关做国密转换或者在前面包一层标准 TLS。遇到解析异常时先判断流量到底是标准 TLS 还是国密 TLS再去想是工具问题还是报文问题这样排查路径清晰很多。最后分享一个小习惯我每到一个新环境都会先抓 30 秒的“背景包”存个底再用 Wireshark-GM 生成一份《会话摘要》存着。这样后面哪怕问题反复出现也有一个初始基线可以对照。别小看这个习惯它帮我省过好几次“重启重试”的死循环。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑