SSL体系结构
-
从服务类型看,IP层是点到点,而传输层提供的是端到端的服务
-
从服务质量看,传输层提高了可靠性,使上层应用不必关注可靠性问题,仅需解决自身应用功能相关的问题
-
从协议依赖关系看,应用层协议直接构建于传输层之上
-
协议栈层次上,SSL位于应用层和传输层之间
-
使用SSL保护的高层应用报文需要封装在 SSL报文中投递,而所有SSL报文最终仍要封装在传输层报文中传递
SSLv3是一个协议套件,由4个协议组成:握手协议、记录协议、更改密码规范协议以及警告协议
高低两层结构
高层:SSL握手协议层(Handshake Protocol Layer)
握手层,负责通信实体在应用SSL协议传送数据之前的 相互验证身份、协商加密算法、生成密钥
包括:握手协议、更改密码规范协议以及警告协议
低层:SSL记录协议层(Record Protocol Layer)
记录层,负责封装各种高层协议,具体实施 压缩与解压缩、加密与解密、计算并验证MAC等安全相关操作
包括:记录协议
SSL协议流程
建立TCP连接
- 整个通信过程由客户端发起,经过三次握手与服务器建立TCP连接
- 连接成功后才进入SSL握手和数据传输阶段
握手协商
- 握手开始: 客户端(如浏览器)发起连接请求,并向服务器发送一个“ClientHello”消息。这个消息包含了客户端支持的SSL/TLS版本、加密算法列表、随机数以及其他相关信息。
- 服务器响应: 服务器接收到“ClientHello”后,会回复一个“ServerHello”消息。这个消息中包含了服务器选择的SSL/TLS版本、加密套件(包括加密算法、密钥交换算法和消息认证码算法)、以及服务器生成的随机数。
- 证书交换: 服务器通常会发送其数字证书,以证明其身份。证书中包含了服务器的身份信息以及一个由受信任的第三方机构(称为证书颁发机构CA)签名的公钥。
- 密钥交换: 客户端验证服务器证书的有效性后,双方会进行密钥交换。这可能涉及到使用服务器证书中的公钥进行加密,或者使用特定的密钥交换算法(如RSA、DH或ECDH)生成共享的秘密密钥。
- 生成会话密钥: 使用之前交换的信息和密钥,客户端和服务器都会**独立**地计算出一个对称会话密钥。这个密钥将用于后续的数据传输加密和解密,因为它比公钥加密更快且更高效。
- 完成握手: 最后,客户端和服务器通过“ChangeCipherSpec”和“Finished”消息通知对方,从现在开始将使用新的会话密钥进行加密通信。服务器也会发送一个“Finished”消息作为回应,确认握手过程已完成。
数据传输
连接断开
TCP连接断开
- 客户端和服务器分别交互FIN和ACK报文,断开TCP连接(四次挥手)
- 该连接的通信过程结束
握手层及协议协议
握手目的
- 客户端与服务器就一组用于保护数据的算法达成一致
- 确立与算法相关的密钥
- 对服务器(客户端)进行认证
握手消息
- ClientHello:握手发起
- ServerHello:包含了服务器选择的算法
- Certificate:包含了服务器的证书
- ServerHelloDone:标志服务器这一握手阶段完成
- ClientKeyExchange:发送预主密钥
- Finished:包含握手消息的MAC
更改密码规范
更改密码规范,对应消息ChangeCipherSpec
- 通信双方使用它互相通告将启用新的密码规范
- 在客户端,该消息在ClientKeyExchange消息和finished消息之间
- 在服务器端,它是收到客户端finished消息后发送的第一条消息
ChangeCipherSpec独立成一个协议?
- 从功能上看,握手协议主要用于安全参数协商,ChangeCipherSpec只是一种消息通知机制,所以协议设计者并没有把它作为握手协议的一部分
- SSL规范规定,不同类型的消息不能封装到同一条记录
-
- ChangeCipherSpec为明文传输,而随后的Finished消息需要加密传输,二者不能放在一个记录
- Finished消息是一条握手消息,将ChangeCipherSpec独立就可以保证这两条消息不会封装到一条记录
在传递完ChangeCipherSpec消息后,客户端和服务器还会各自发送一条Finished消息
Finished消息包含之前所有握手消息的**MAC**
作用:防止通过篡改握手消息实现降级攻击
Finished消息交互完成后,通信双方即可开始传送应用数据
警告协议Alert
消息类型:
- Alert消息是一种专门的消息类型,它在SSL/TLS记录协议中被单独标识和处理。
警告级别:
- Alert消息分为两个级别:Warning和Fatal。
- Warning级别的警报表示一个非严重的问题,通信可以继续。
- Fatal级别的警报表示一个严重错误或异常,接收到此类警报的一方应立即终止连接。
警告描述:
- 每个警报都由一个唯一的警报描述符标识,这些描述符定义在SSL/TLS协议规范中。
- 例如,"Bad Record MAC"表示MAC校验失败,"Handshake Failure"表示握手过程失败等。
发送警报:
- 当一方在SSL/TLS连接中遇到问题时,它可以发送一个Alert消息给对方。
- 警告消息通常伴随着关闭TCP连接的动作,特别是对于Fatal级别的警报。
处理警报:
- 接收到警报的一方应该根据警报的级别和描述采取适当的行动。
- 对于Warning级别的警报,可能需要记录事件并继续通信。
- 对于Fatal级别的警报,必须立即终止连接,并可能需要进行进一步的诊断和处理。
SSL会话恢复
- SSL会话恢复是一种优化机制,用于减少重复握手过程带来的开销。在首次握手过程中,客户端和服务器会协商一个会话ID和相关的加密参数。
- 当客户端在后续的连接中希望恢复之前的SSL会话时,它会在ClientHello消息中包含之前协商的会话ID。
- 如果服务器能够识别并接受这个会话ID,那么双方就可以跳过大部分的握手过程,直接使用之前协商的加密参数进行通信,从而提高了效率。
记录层与数据处理
SSL数据单元的形成过程
分片
- 如果SSL记录的长度超过了最大传输单元(MTU),那么记录可能会被分割成多个片段进行发送。
- 将应用层协议数据分割为大小适当的片段,以便封装在记录中传输
- 每个分片最大2^14字节(16364B)
压缩
- 压缩功能是可选的
- 压缩过程为无损压缩
- 压缩后的内容长度不能超过原有长度 2^14 +1024 字 节 , 即17408
- SSLv3没有指定压缩算法,预设的算法是null
附加MAC
- 为了确保数据的完整性并防止篡改,SSL/TLS协议会为每个数据片段计算一个MAC值。MAC是基于会话密钥和数据内容生成的一个固定长度的代码。它会被附加到数据片段的末尾,以便接收方能够验证数据的完整性和真实性。
加密
- 对压缩后的数据和MAC做对称加密
- 加密后的数据长度最多只能比加密前多1024B
- 经过压缩和加密处理后,整个数据块长度不会超过(2^14+1024+1024)=18432 B
附加SSL报头
- 数据类型(Content type),8位:用来处理这个分片的上层协议
- 主要版本号(Major Version),8位:所使用的SSL。协议的主要版本,对于SSLv3协议来说,这个字段值为3
- 次要版本号(Minor Version),8位:表示使用的次要版本,对于SSLv3协议来说,这个字段值为0
- 压缩后数据长度(Compressed length),16位:这个明文分片的长度(假如此分片已经过压缩,则为压缩后的长度)