国密协议在握手的核心逻辑上与标准TLS相似,但它的独特之处在于:它拥有自己独立的协议版本、加密套件和标志性的“双证书”体系。
正式抓包前,你需要在Wireshark配置密钥记录,或在环境层面满足协议条件,这是防止只看到乱码的关键。
一、核心原理:国密握手,到底握了什么?
国密协议(标准代号GB/T 38636-2020 TLCP,也称GMSSL或GMTLS)的核心是“双证书体系”。为了让你更直观地理解这种区别,我画了一张与标准TLS 1.2的对比图:
mermaid
sequenceDiagram
participant C as 客户端 (Client)
participant S as 服务端 (Server)
Note over C,S: ⚠️ 国密双证书握手机制 (GMSSL/TLCP)
C->>S: Client Hello <br/>(含国密套件 0xE013等)
S->>C: Server Hello <br/>(确认国密套件)
Note right of S: ✨ 双证书认证开始
S->>C: Certificate (包含两个证书)<br/>1. 签名证书<br/>2. 加密证书
S->>C: Server Key Exchange / Server Hello Done
C->>S: Client Key Exchange <br/>(用SM2加密PreMasterSecret)
C->>S: Change Cipher Spec & Finished
S->>C: Change Cipher Spec & Finished
Note over C,S: 🔐 加密通道建立 (SM4/SM3)
根据上面的流程图,整个握手过程可以拆解为以下三个关键步骤:
1. 协议与套件协商 (Client Hello → Server Hello):
Client Hello: 客户端宣告其支持国密协议,其协议版本字段为 `0x0101`。同时,会在加密套件(Cipher Suites)列表中带上国密套件,如 `0xE013`(对应 `ECC-SM2-SM4-CBC-SM3`)。
Server Hello: 服务端收到后,会从列表中挑选一个双方都支持的国密套件作为回应,正式确立本次通信采用的密码方案。
2. 国密双证书认证 (Server Certificate):
这是国密握手最核心的环节。服务端会一次性发出两张证书:
签名证书: 用于身份认证,证明“我(服务器)就是我要宣称的那个实体”。
加密证书: 用于密钥交换,其包含的SM2公钥将用于加密后续的关键密钥材料。
在Wireshark中,你会在一个包内看到依次排列的两个证书。
3. 密钥交换与握手完成: 客户端用服务端加密证书中的SM2公钥,加密一个自己生成的预备主密钥发送给服务端。双方根据这个预备主密钥生成会话密钥。最后,双方通过 `Change Cipher Spec` 和 `Finished` 消息确认密钥生效,加密通信通道正式建立。
二、解决方案:两种方法,精准抓包
方法一:SSLKEYLOGFILE 密钥法(推荐)
这种方法是让应用将加密会话的“种子”(密钥材料)写入一个日志文件,Wireshark再读取这个文件来实现解密。此方法广泛适用于Chrome、Firefox等主流浏览器以及 `gmssl` 命令行工具,对现代TLS协议完全适用。
第一步:设置密钥记录环境
在启动目标程序(如浏览器)的终端中设置环境变量 `SSLKEYLOGFILE`。
```bash
# Linux / macOS
export SSLKEYLOGFILE=/path/to/your/sslkeylogfile.txt
google-chrome &
# 或 firefox &
# Windows (在cmd中)
set SSLKEYLOGFILE=C:\path\to\your\sslkeylogfile.txt
start chrome.exe
注意:此方法要求目标应用支持`SSLKEYLOGFILE`。对于自研的国密客户端,你可能需要检查其内部使用的国密库(如GmSSL)是否支持,或寻找其它调试方法。
之后,Wireshark能捕获到的国密握手报文如下:

图中显示了协议版本`0x0101`、国密套件`0xE013`以及后续的双证书报文。
第二步:配置Wireshark
打开Wireshark,进入 编辑 → 首选项 → 协议 → TLS,在 `(Pre)-Master-Secret log filename` 字段填入你上面设置的文件路径,点击确定即可。

方法二:使用国密专版工具(简化版)
若第一种方法的操作比较繁琐,或想直接获得更完善的解析能力,可以尝试以下专版工具:
电信数智密评中心定制版Wireshark: 此工具基于Wireshark 3.7.1深度改造,从源码层面集成了对TLCP、国密算法套件及双证书体系的解析能力。安装后可直接解析国密流量,对算法合规性等问题的判定效率会高很多。
其他抓包工具:
Yakit: 一款综合安全工具,支持配置国密双向认证,可用于测试和抓包。
GMProxy: 专门针对国密TLS的代理工具,可用于抓取并分析国密流量。
三、排错技巧:抓包分析四大要点
1. 确认国密协议版本: 在抓包文件中,检查**Client Hello**报文的`Version`字段,国密协议的版本号应为`0x0101`。如果显示为`0x0301`或`0x0303`,说明客户端可能并未发起国密握手。
兼容模式说明:360国密浏览器为了兼容性,通常会先尝试标准TLS握手,失败后才发起国密(GMSSL)握手,若发现连接建立较慢,这属于正常现象。
2. 检查密码套件: 查看Client Hello中的Cipher Suites列表,必须包含`0xE013`(ECC-SM2-SM4-CBC-SM3)等国密套件。
3. 验证双证书: 找到Server Certificate报文。展开后,应看到`certificate_list`中包含两个独立的证书。你可以点击并查看其详细信息,确认签名算法为`sm2SignWithSm3`,并且证书用途包含`TLS Web Server Authentication`。
4. 关注Alert信息: 如果握手失败,Wireshark中通常会出现`Alert`类型的报文。展开查看其`Description`字段,常见的错误包括:
`protocol_version`: 双方协议版本不匹配。
`handshake_failure`: 没有共同的密码套件。
`bad_certificate`: 证书验证失败。
`decrypt_error`:在Change Cipher Spec消息后出现,通常表示密钥交换或证书验证环节出错。
四、总结
处理国密抓包的核心思路,在于理解它从协议版本到双证书体系的整个定制化路径。当你学会从海量网络数据中精确找到这几个关键特征时,再复杂的国密通信问题,也就有了清晰的排查方向。