准备工作
Windows PC电脑;
国密SSL VPN客户端(浏览器);
Wireshark客户端(需支持国密协议版本,github地址),用于查看握手数据。
抓包
打开wireshark客户端,监听对应的网卡??梢栽诹蓖ü齱ireshark查看哪个网卡有网络波动,选择对应的网卡。
Wireshark设置按照IP过滤,设置SSL VPN连接的国密服务器IP过滤。IP地址即为安全接入的网关或安全服务的地址。
连接SSLVPN,待连接状态变为“已连接”后,即可停止抓包。 Wireshark编码配置,使用OpenVPN解析国密算法数据。
此时可以看到通过GMTLS协议的握手数据。根据请求我们具体分析。
分析
第一阶段:
客户端向服务端发送Client Hello消息,传送客户端支持的最高 SSL 协议的版本号、随机数、加密算法列表,以及其他所需信息。Client Hello消息的内容如下图所示:
第二阶段:
服务端收到客户端建立SSL连接的请求后,通过发送Server Hello消息向客户端传送SSL 协议的版本号、随机数、会话ID、加密算法的种类以及其他相关信息。消息内容如下:
同时服务端向客户端发送包含其证书的Certificate消息。证书中所携带服务端的公钥。如下图所示:
服务端发送完Certificate消息后继续发送Server Key Exchange消息,Server Key Exchange消息中包含有密钥交换算法所需要的额外参数。如下图所示:
发送Certificate Request消息,要求服务端上报证书,如下图所示:
随后发送Server Hello Done消息,表示服务端已经发送完此阶段的全部消息。如下图所示:
第三阶段:
客户端发送Client Key Exchange和Change Cipher Spec消息,Client Key Exchange包含使用服务器公钥加密过的随机数Pre_Master_Secret,该参数用于后续生成主密钥。(此处客户端使用前面提到的两个随机数,再生成第三个随机数,然后通过服务端证书中的公钥对第三个随机数加密,生成该Pre_Master_Secret)**;Change Cipher Spec消息告诉服务器,接下来的消息将采用新协商的加密套件和密钥进行通信,并通知客户端到服务器的握手过程结束。如下图所示:
注:根据配置不同,可能会发送证书用于证书验证 随机数3 = f(随机数1,随机数2) Pre_Master_Secret= 公钥加密(随机数3) 服务器收到Pre_Master_Secret后,会使用自己的私钥解密,获取到随机数3的值,至此,客户端和服务端都知道了这3个随机数了。
第四阶段:
服务端同样发送Change Cipher Spe消息通知服务端到客户端的握手过程结束,并发送一个加密的握手数据Encrypted Handshake Message 消息,客户端收到消息解密后进行验证,验证通过则说明握手过程中的数据没有被篡改过,也说明服务端是之前交换证书的持有者。现在双方就可以开始加密通信。如下图所示:
握手过程总结:
- 建立TCP或UDP连接。
- 客户端向服务端发送 client hello
- 服务端向客户端返回 server hello
- 服务端返回证书,server Key Exchange、请求客户端证书, server hello Done。
- 客户端上报自己的证书给服务端,client key exchange,传输协商后的密钥给服务端。
- 服务端验证客户端的证书,change cipher spec、encrypted handshake
- 服务端发送 change cipher spec、encrypted handshake
- 握手协商完成,进行应用层面交互,通过前面的协商密钥来加密。