SSL握手过程实例分析

为了更好理解SSL协议的握手过程,结合实例,使用Wireshark抓包分析SSL握手过程中客户端与服务器间的交互过程。本例中服务器为https://www.baidu.com/(180.97.33.108),客户端为本机浏览器(192.168.0.109)。

本实例中只有客户端验证服务端,服务端并没有对客户端进行验证,一般相互进行身份认证的情况在登录银行系统时会用到。

0x01 第一阶段

  客户端浏览器向服务器发起TCP连接请求,建立起TCP连接后,客户端向服务器发送Client Hello消息,传送客户端支持的最高 SSL 协议的版本号、随机数、加密算法列表,以及其他所需信息。Client Hello消息的内容如下图所示:

这里写图片描述

  通过上图可以知道Client Hello消息结构如下:

这里写图片描述

  Cipher Suits字段是一个枚举类型,说明了客户端所支持算法,每个Cipher Suit指定了一个加密组合,如下图所示:


  服务器收到客户端建立SSL连接的请求后,通过发送Server Hello消息向客户端传送SSL 协议的版本号、随机数、会话ID、加密算法的种类以及其他相关信息。消息内容如下:


   通过上图可知Server Hello消息结构如图所示:

Randon:由随机种子gmt_unix_time使用伪随机数函数(PRF)生成的32字节随机数。
session ID:如果没有建立过连接则对应值为空,不为空则说明之前建立过对应的连接并缓存。
Cipher Suite:指定了服务端选定的加密组合,这里选出的加密组合是TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,ECDHE_RSA作为密钥交换算法。128位的AES分组加密算法,SHA作为消息摘要算法。
Compress Method:记录层接收高层协议的数据时使用的压缩算法,这里没有使用压缩算法,所以是null。

0x02 第二阶段

  服务器向客户端发送包含其证书的Certificate消息。证书中所携带服务器的公钥,用于加密后面消息中预主密钥。消息内容如下:

这里写图片描述


  从图中可以看到,服务器实际上发送的是一条证书链,包含从服务器证书到其根证书总共3个证书,证书所有者分别是VeriSign、Symantec和baidu。其中服务器证书内容如下:


   从图中可以看到证书的各字段信息,包括证书版本号(v3)、证书序列号(0x1ccf7afd633940916d36edd8cca483dc)、证书签名算法、颁发者信息(Symantec)和证书有效期(‎2015‎年‎9‎月‎17‎日 8:00:00至‎2016‎年‎9‎月‎1‎日 7:59:59)。


  接下来还包括证书持有者(baidu.com…)、证书公钥信息(30 82 01 0a 02 82 01 01 00 a8 72 cf eb 76 51 bb…)、扩展字段(持有者备用名称、基本约束、密钥用法、增强型密钥用法、证书策略、颁发机构密钥标识符、CRL分发点、颁发机构信息访问),最后是证书的签名算法(SHA-256 RSA加密)和证书的签名值(76 af 46 03 3b bd d8 9f 3e 2b 62 48 dd 8d 89 32 07 49 20 …)。






  通过以上分析可知证书结构如下图所示:

0x03 第三阶段与第四阶段

  服务器发送完Certificate消息后继续发送Server Key Exchange和Server Hello Done消息,Server Key Exchange消息中包含有密钥交换算法所需要的额外参数。Server Hello Done消息表示服务器已发送完此阶段的全部信息。

这里写图片描述

  客户端发送Client Key Exchange和Change Cipher Spec消息,Client Key Exchange包含使用服务器RSA公钥加密过的随机数Pre_Master_Secret,该参数用于后续生成主密钥;Change Cipher Spec消息告诉服务器,接下来的消息将采用新协商的加密套件和密钥进行通信,并通知客户端到服务器的握手过程结束。

这里写图片描述

  接着服务器同样发送Change Cipher Spe消息通知服务器到客户端的握手过程结束,并发送一个加密的握手数据Encrypted Handshake Message 消息,客户端收到消息解密后进行验证,验证通过则说明握手过程中的数据没有被篡改过,也说明服务器是之前交换证书的持有者。现在双方就可以开始加密通信。

这里写图片描述

你可能感兴趣的:(openssl)