SSL协议之握手协议
1. 首先大致看下流程,使用我电脑的浏览器访问百度的180.101.49.11
2. 第一步:客户端向服务器发送ClientHello
ClientHello中涉及到的消息具体如下:
客户端版本,按优先级列出客户端支持的协议版本,首选客户端希望支持的最新协议版本。
客户端随机数Random
会话ID(Session id)
如果客户端第一次连接到服务器,那么这个字段就会保持为空。上图中该字段为空,说明这是第一次连接到服务器。
加密套件:
客户端会给服务器发送自己已经知道的密码套件列表,这是由客户按优先级排列的,但完全由服务器来决定发送与否。TLS中使用的密码套件有一种标准格式。上面的报文中,客户端发送了17套加密套件。服务端会从中选出一种来作为双方共同的加密套件。
压缩方法:
为了减少带宽,可以进行压缩。
扩展包:
其他参数(如服务器名称,填充,支持的签名算法等)可以作为扩展名使用。
这些是客户端问候的一部分,如果已收到客户端问候,接下来就是服务器的确认,服务器将发送服务器问候。
3. 第二步:服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Ciphers Suites里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 Random2。
ServerHello中涉及到的具体参数:
服务器版本Version:服务器会选择客户端支持的最新版本。
服务器随机数Random:服务器和客户端都会生成32字节的随机数。用来创建加密密钥。
加密套件:服务器会从客户端发送的加密套件列表中选出一个加密套件。
会话ID(Session ID):服务器将约定的Session参数存储在TLS缓存中,并生成与其对应的Session id。
压缩算法:如果支持,服务器将同意客户端的首选压缩方法。
扩展包
4. 这个阶段之后,客户端服务端知道了下列内容:
SSL版本
密钥交换、信息验证和加密算法
压缩方法
有关密钥生成的两个随机数。
5. 第四步:服务器向客户端发送Certificate消息,服务器将数字证书和到根CA整个链发给客户端,使客户端能用服务器证书中的服务器公钥认证服务器。
消息包含一个X.509证书,证书中包含公钥,发给客户端用来验证签名或在密钥交换的时候给消息加密。这一步是服务端将自己的证书下发给客户端,让客户端验证服务器的身份,客户端验证通过后取出证书中的公钥。
6. 第五步:服务器向客户端发送Server Key Exchange,根据之前在ClientHello消息中包含的CipherSuite信息,决定了密钥交换方式(例如RSA或者DH),因此在Server Key Exchange消息中便会包含完成密钥交换所需的一系列参数。
7. 第七步: 服务器向客户端发送Server Hello Done,该消息表示服务器已经将所有信息发送完毕,接下来等待客户端的消息。
8. 第8步: 客户端向服务器端发送Client Key exchange,Change Cipher Spec,Handshake,一共发了3个消息。其实这一步我不是明白什么意思
9. 最后一步:服务器向客户端发送Server Hello Done,握手结束