SSL/TLS握手协议
握手协议是指客户端和服务器之间交换的一系列消息。
消息格式
类型 | 长度 | 内容 |
---|---|---|
1字节 | 3字节 | ≥0字节 |
类型
表示10种消息中的一种。所有类型如下:
hello_request | 空 |
---|---|
client_hello | 建立初始的逻辑连接 |
server_hello | 同上 |
certificate | 一系列证书 |
certificate_request | 请求证书 |
certificate_verify | 证书验证 |
server_key_change | 服务器秘钥交换 |
client_key_change | 客户端秘钥交换 |
server_done | 消息结束,等待回复 |
finished | 密码已经变更完成 |
长度
消息长度(字节)。
内容
阶段1:建立安全功能
由客户端发起,建立初始的逻辑连接,并为后面的阶段交换所需参数。
client hello消息内容:
- 版本号:客户端支持的最高TLS版本。
- 随机数:32位的时间戳 + 客户端生成的28字节的随机数。可以为这次握手防止重放攻击,但不作为后续**的参数。
- 会话标志:分为0值和非零值。
0值:客户端想在新会话上建立一个新连接。
非0值:在原会话上建立一个新连接。 - 密码组:按优先级降序排列的密码算法列表。表中每行包括2个元素:**交换方法和CipherSpec(密码说明)。
- 压缩方法:客户端支持的所有压缩方法的列表。
server hello消息:
-
版本号:决定使用的版本号。
-
随机数:服务器生成的随机数(也同时生成了时间戳)。
-
会话标识:
若客户端发的是0值:则服务器生成一个新连接,发回新ID。
若客户端是非0值:则服务器发送同样的数值。 -
密码组:决定使用的密码组。
-
压缩方法:决定使用的压缩方法。
密码组详情
- 交换**的方法
① RSA 非对称加密
② 固定DH
③ 瞬时DH
④ 匿名DH- cipher spec 密码说明
① 密码算法(任何算法,如RC4,DES3,IDEA等)
② MAC算法(MD5,SHA-1)
③ 密码类型(流 / 块)
④ 可否出口(可 / 不可)???
⑤ 散列长度(0 / 16(MD5) / 20(SHA-1))
⑥ **材料???
⑦ IV大小(CBC分组的初始向量大小)
.
.
阶段2:服务器的认证和**交换
服务器承接阶段1,继续发送消息,可能发送 对自己身份的认证,**参数(哪个**?)和请求客户端表明身份等等。
certificate 消息:
- 内容:一个或一组X.509证书(证明服务器身份,具体查看X.509部分)。
- 不需要certificate消息:使用匿名DH 。
- 若是固定DH 会在此消息中附加服务器DH公钥的参数(后面无需再发server key change消息)
server_key_change 消息:
- 不需要此消息的情况:
① 若服务器发送了带有固定DH的参数的certificate消息;
② 若使用RSA**交换(???)。
. - 必需此消息的情况:
① 匿名DH(两个全局DH值 和 服务器DH公钥)。
② 瞬时DH(三个DH参数))。
③ RSA,且服务器仅用了RSA签名**。???
certificate request消息:
- 内容:证书类型 + 签证机构。
- 证书类型:表明公钥算法和它对应的用途???
RSA:仅用于签名
DSS:仅用于签名
固定DH的RSA:发送RSA签名证书,其签名仅用于认证。
固定DH的DSS:仅用于认证。 - 签证机构:可接受的签证机构列表
server done 消息:
-
表明服务器hello结束,等待客户端应答。
-
无参数
.
.
阶段3:客户端的认证和**交换
在收到server done后,客户端检验服务器的证书合不合法,再检验server hello的参数能否接受。一切无误之后,开始向服务器发送消息。
certificate 消息:
- 如果服务器发了certificate request,那么客户端才会回应certificate。
若不能提供合适的证书,客户端会发一条“无证书警告”。
client key change 消息:
- 内容 依赖于双方共同决定的**交换类型:
① RSA:.客户端生成的48字节次**,并用服务器certificate中的公钥 / server key change中的临时RSA**加密。后面用它生成主**。???
② 瞬时DH 和 匿名DH:发送客户端DH公钥参数。
③ 固定DH:由于certificate消息中已包含DH参数,故此条消息为空。
certificate verify 消息:
- 提供对客户端证书的精准认证。(只有客户端证书具有签名能力时才会发送)???
.
.
阶段4:完成
change cipher spce 消息(不属于握手协议):
- 客户端示意 变更密码规范,并从cipher spec中复制,以挂起cipher spec。
- 于是客户端开始以新的算法和**发送消息
client finished 消息:
- 客户端发送完成消息。
change cipher spce 消息(不属于握手协议):
- 在收到上面2个消息后,服务器 变更密码规范,也从cipher spec中复制,以挂起cipher spec。
- 于是服务器开始以新的算法和**发送消息
server finished 消息:
- 服务器发送完成消息。
.
此时 握手完成,客户端和服务器开始交换应用层数据。
.
.
.
.
.