为了更好理解SSL协议的握手过程,结合实例,使用Wireshark抓包分析SSL握手过程中客户端与服务器间的交互过程。本例中服务器为AcFun弹幕视频网 - 认真你就输啦 (・ω・)ノ- ( ゜- ゜)つロ(58.49.162.241),客户端为本机浏览器(192.168.1.9)
第一阶段
客户端浏览器向服务器发起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。
第二阶段
服务器向客户端发送包含其证书的Certificate消息。证书中所携带服务器的公钥,用于加密后面消息中预主密钥。消息内容如下:
从图中可以看到证书的各字段信息,包括证书版本号(v3)、证书序列号、证书签名算法、颁发者信息(Symantec)和证书有效期.
接下来还包括证书持有者、证书公钥信息、扩展字段(持有者备用名称、基本约束、密钥用法、增强型密钥用法、证书策略、颁发机构密钥标识符、CRL分发点、颁发机构信息访问),最后是证书的签名算法和证书的签名值
第三阶段与第四阶段
服务器发送完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 消息,客户端收到消息解密后进行验证,验证通过则说明握手过程中的数据没有被篡改过,也说明服务器是之前交换证书的持有者。现在双方就可以开始加密通信。