商密TLCP协议浅析——抓包分析

2,127 阅读3分钟

《中华人民共和国密码法》第二十七条规定:法律、行政法规和国家有关规定要求使用商用密码进行保护的关键信息基础设施,其运营者应当使用商用密码进行保护,自行或者委托商用密码检测机构开展商用密码应用安全性评估。商用密码应用安全性评估应当与关键信息基础设施安全检测评估、网络安全等级测评制度相衔接,避免重复评估、测评。

随着对网络安全的重视和密评的普及,各种基础设施建设都要求使用商密进行加密。不仅仅是存储层面,在数据传输的时候也需要使用商密进行加密。本文主要对商密的数据传输加密协议进行简要分析,普通数据传输加密我们通常使用TLS对传输通道进行加密,HTTPS就是最常见的实现。TLCP原理与TLS基本相同,都是对数据进行对称加密,对称加密所使用的密钥通过非对称加密传输,具体差别在分析时进行简要说明。

对TLCP协议进行抓包分析

使用gmssl进行测试

gmssl tlcp_server -port 4433 -cert double_certs.pem -key signkey.pem -pass 1234 -ex_key enckey.pem -ex_pass 1234

gmssl tlcp_client -host 127.0.0.1 -port 4433

tlcp单项认证.png 经历tcp三次握手后开始TLCP握手

sequenceDiagram
client->>server: 1、Client Hello
server->>client: 2、Server Hello
server->>client: 3、Certificate
server->>client: 4、Server Key Exchange
server->>client: 5、Server Hello Done
client->>server: 6、Client Key Exchange
client->>server: 7、Change Cipher Spec, Encrypted Handshake Message
server->>client: 8、Change Cipher Spec
server->>client: 9、Encrypted Handshake Message

逐步分析

  1. Client Hello

Screenshot_20230201_113629.png 这个请求的Record Layer的Version字段为(0x0101)不同于TLS的version,来做区别。之后的所有请求都会使用该标志。 主要看Handshake Protococl,发送了一个随机数以及加密套件选择列表,这里只有一个ECC_SM4_CBC_SM3(0xe013)

  1. Server Hello

返回了一个随机数,确定了密码套件,因为client只给了一个,服务端只能用那一个。

  1. Certificate

服务端下发证书给客户端,该证书中包含sm2公钥。

  1. Server Key Exchange

下发密钥交换的额外数据,通过传递一些参数,并且双方通过计算确定对称加密的密钥,同时如果黑客获取了这些参数,也无法破解出密钥。这是使用的密钥交换算法为ECC。

  1. Server Hello Done

服务器向客户端说明,已经将所有预计的握手消息发送完毕。

  1. Client Key Exchange

同Server Key Exchange,这里的具体信息其实在抓包的时候看不太出来的太多有用的信息,因为这个主要涉及密钥交换算法。有空可另开一篇详解。

7.8.9. Change Cipher Spec, Encrypted Handshake Message

更改密码规格,告诉服务器,之后的请求都使用加密的形式。并且包含了一个加密的握手协议,让服务端尝试进行解密,来确保之前的握手是成功的。

从抓包层面看与TLS区别

  1. 版本不同,TLCP为0x0101
  2. 加密套件不同,TLCP主要使用的是包含国密算法的加密套件

还有一点很大的不同在抓包过程中并没有体现出来,即双证书体系。。该体系要求通信端提供两个证书:认证证书和加密证书。其中认证证书与TLS协议使用的证书功能类似,用于对通信端的身份进行验证。而加密证书则为TLCP协议独有,它只会用于密钥交换。这点在命令行中也有体现,建立server端时需要指定两个证书-key和-ex_key,且-cert double_certs.pem指定的证书也不简单:

cat signcert.pem > double_certs.pem  
cat enccert.pem >> double_certs.pem  
cat cacert.pem >> double_certs.pem

对于这b部分,我将会在下个章节中通过代码分析进行详细说明。