国密协议在握手的核心逻辑上与标准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能捕获到的国密握手报文如下:

        ![](https://img-blog.csdnimg.cn/img_convert/800d1c7c9bbcf32aa11e3c05a28ecdc1.png)

        图中显示了协议版本`0x0101`、国密套件`0xE013`以及后续的双证书报文。

      第二步:配置Wireshark

        打开Wireshark,进入  编辑  →  首选项  →  协议  →  TLS,在  `(Pre)-Master-Secret  log  filename`  字段填入你上面设置的文件路径,点击确定即可。

        ![](https://img-blog.csdnimg.cn/direct/8ea2f654a4794c389abb75d4603d7883.png#pic_center)

方法二:使用国密专版工具(简化版)

若第一种方法的操作比较繁琐,或想直接获得更完善的解析能力,可以尝试以下专版工具:

      电信数智密评中心定制版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消息后出现,通常表示密钥交换或证书验证环节出错。

四、总结

处理国密抓包的核心思路,在于理解它从协议版本到双证书体系的整个定制化路径。当你学会从海量网络数据中精确找到这几个关键特征时,再复杂的国密通信问题,也就有了清晰的排查方向。