前情提要
- 使用Clion和gmssl动态库实现服务器server和客户端client之间的SSL通信,测试指定密码套件_MY CUP OF TEA的博客-CSDN博客
- 在基于 Ubuntu 的 Linux 发行版上安装 Wireshark_MY CUP OF TEA的博客-CSDN博客
- 本地搭建server和客户端使用端口进行数据通信,使用Wireshark抓取127.0.0.1环回地址并分析通信数据_MY CUP OF TEA的博客-CSDN博客_wireshark抓127.0.0.1
- 使用wireshark抓包,本地环回测试通信数据已经通过SM4国密算法加密_MY CUP OF TEA的博客-CSDN博客_sm4 在线测试
参考链接
- 用wireshark抓包分析TLS协议_GEEK_BD_bro的博客-CSDN博客_wireshark 过滤tls
启动wireshark
- 虽然配置wireshark的时候,选择所有用户均可进行抓包,但是在真正使用的时候,普通用户还是会存在问题,通过鼠标点击图标的方式启动wireshark,默认是当前用户,不是root用户,不光界面不一样,且不允许抓包
- 开启终端,使用命令 sudo wireshark 开启wireshark软件,进行抓包
- 参考上述链接里面的server和客户端的代码,指定ip地址为127.0.0.1,端口为7838,因此本文采用本地环回的方式进行数据包的抓取和分析
操作流程
- wireshark 选择本地环回
- 在过滤栏设置过滤条件进行数据包列表过滤输入 tls,表示只显示TLS协议的数据包
- 开启服务端
- 开启客户端
补充知识
- SSL/TLS是保护计算机网络通讯安全的一类加密协议,它们在传输层上给原先非安全的应用层协议提供加密保护,如非安全的HTTP协议即可被SSL/TLS保护形成安全的HTTPS协议。
- SSL、TLS协议其实是有所差异的,TLS协议是继承了SSL协议并写入RFC,标准化后的产物。因此,通常使用SSL来指代SSL协议和TLS协议。
- SSL (Secure Socket Layer)安全套接字层协议
- SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。
- 分为SSL记录协议和SSL握手协议。
- TLS(Transport Layer Security)传输层安全协议
- 用于两个应用程序之间提供保密性和数据完整性。
- 分为TLS记录协议和TLS握手协议。
- 区别:
- SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。
- TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的
服务端和客户端通信流程
蓝色表示客户端-->服务端;绿色表示服务端 --> 客户端
- Client Hello:客户端向服务端打招呼;携带支持的协议、支持的安全套件供服务端选择;
- Server Hello:服务端回应客户客户端的招呼信息;结合客户端的信息,选择合适的加密套件;
- Certificate:服务端向客户端发送自己的数字证书(此证书包含服务端的公钥),以实现验证身份;
- Server Key Exchange:服务端向客户端发送基于选择的加密套件生成的公钥(此公钥为椭圆曲线的公钥,用于协商出对称加密的密钥);
- Server Hello Done:服务端向客户端表示响应结束;
- Client Key Exchange:客户端向服务端发送自己生成的公钥(此公钥为椭圆曲线的公钥,用于协商出对称加密的密钥);
- Change Cipher Spec:变更密码规范;告知服务端/客户端,以后的通信都是基于AES加密的;
- Encrypted Handshake Message:基于协商生成的密钥,用AES加密验证信息让服务端/客户端进行认证;如果对方可以解密,则双方认证无误开始通信;
- New Session Ticket:是优化SSL连接的一种方法,此处不做特别说明
- 注:Certificate Request:服务器如果需要验证客户端的身份,那么服务器会发一个“Certificate Request”给浏览器,而在很多实现中,服务器一般不需要验证客户端的身份
协议包分析
Client Hello包
- Random Bytes:客户端产生的28字节随机数,用于生成最终密钥,后面的过程还会传递两个随机数,三个随机数做为EC Diffie-Hellman算法的相关参数,运算出会话密钥。先把这个随机数称为random_c.
- Session ID:会话标识符:如果是一个新的连接,这个值为0
- Cipher Suites:加密套件(客户端共支持17个加密套件),服务器会从中选择一个服务器也支持的加密套件
- Compression Methods:客户端支持的压缩方法
- Extension: ALPN:客户端支持的应用层协议;未找到依据
- Extension: signature_algorithms: 客户端支持的签名算
Cipher Suites:Unknown(0xe107)
- 客户端内部指定了gmssl支持的密码学套件
- 0xE1,0x07 - ECDHE-SM2-WITH-SMS4-GCM-SM3 TLSv1.2 Kx=ECDH Au=SM2 Enc=SMS4GCM(128) Mac=AEAD
//指定密码算法套件// gmssl ciphers -V 明确支持SSL_CTX_set_cipher_list(ctx,"ECDHE-SM2-WITH-SMS4-GCM-SM3");
Server Hello, Certificate, Certificate Status, Server Key Exchange, Server Hello Done包
Server Hello段
- Random Bytes:服务器生成的随机数random_s
- Cipher Suites:服务器选择的加密套件:0xe107
- Compression Methods:服务器选择的压缩算法为NULL压缩算法。(不支持任何压缩算法),压缩基本由应用层来完成。
Certificate
- Certificate: 服务器返回了两个证书: 第一个是CA签发的证书(Bing),本模拟实验中,此处是指服务器证书;第二个是CA链的证书,本模拟实验中,此处是指CA根证书。
- 客户端收到这个证书后,可以根据证书链来验证证书的真伪,进而判断服务器是真是假。服务器和客户端的证书均是由根CA进行签名认证的
- 服务器证书中存放一个公钥,用于加密后面生成的Premaster secret
Server Key Exchange段
- 受限于特定的密码算法套件
Certificate Request
- Certificate Request:服务器如果需要验证客户端的身份,那么服务器会发一个“Certificate Request”给浏览器,而在很多实现中,服务器一般不需要验证客户端的身份
Server Hello Done段
Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message 包
Certificate
- 服务端开启了对于客户端的身份认证
- 第一个是CA签发的证书(Bing),本模拟实验中,此处是指客户端证书;第二个是CA链的证书,本模拟实验中,此处是指CA根证书。
- 服务器收到这个证书后,可以根据证书链来验证证书的真伪,进而判断客户端是真是假。服务器和客户端的证书均是由根CA进行签名认证的
Client Key Exchange段
Certificate Verify
Change Cipher Spec段
-
变更密码规范协议,它非常简单,就是一条通知消息,告知对方以后的通信都是加密的;
Encrypted Handshake Message
- 客户端使用生成的对话密钥,加密之前所有收发握手消息的Hash和MAC值,发送给服务器,服务器将相同的会话密钥(使用相同方法生成)解密此消息,校验其中的Hash和MAC值。
- 注意:Change Cipher Spec和Encrypted Handshake Message不像Client Hello、Server Hello等是封装在 Handshake Protocol层,而是同Handshake Protocol一样,直接封装在TLS Record Layer层。
Change Cipher Spec, Encrypted Handshake Message包
- Change Cipher Spec:服务器发送Change Cipher Spec消息,通知客户端此消息以后服务器会以加密方式发送数据。服务器使用会话密钥加密之前所有收发握手消息的Hash和MAC值,发送给客户端去校验。
- 若客户端服务器都校验成功,握手阶段完成,双方将按照SSL记录协议的规范使用协商生成的会话密钥加密发送数据。
- 可以看到,之后服务器开始向客户端发送加密消息Application Data。
Application Data包
- 客户端开始向服务器发送加密数据