17. SSL、TLS

SSL全称是Secure Sockets Layer,安全套接字层,它是由网景公司(Netscape)在1994年时设计,主要用于Web的安全传输协议,目的是为网络通信提供机密性、认证性及数据完整性保障。如今,SSL已经成为互联网保密通信的工业标准。

SSL最初的几个版本(SSL 1.0、SSL2.0、SSL 3.0)由网景公司设计和维护,从3.1版本开始,SSL协议由因特网工程任务小组(IETF)正式接管,并更名为TLS(Transport Layer Security),发展至今已有TLS 1.0、TLS1.1、TLS1.2、TLS1.3这几个版本。

TLS名字所说,SSL/TLS协议仅保障传输层安全。同时,由于协议自身特性(数字证书机制),SSL/TLS不能被用于保护多跳(multi-hop)端到端通信,而只能保护点到点通信。

SSL/TLS协议能够提供的安全目标主要包括如下几个:

  • 认证性 借助数字证书认证服务端端和客户端身份,防止身份伪造
  • 机密性 借助加密防止第三方窃听
  • 完整性 借助消息认证码(MAC)保障数据完整性,防止消息篡改
  • 重放保护 通过使用隐式序列号防止重放攻击

为了实现这些安全目标,SSL/TLS协议被设计为一个两阶段协议,分为握手阶段和应用阶段:

握手阶段也称协商阶段,在这一阶段,客户端和服务端端会认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及MasterSecret。后续通信使用的所有密钥都是通过MasterSecret生成。 在握手阶段完成后,进入应用阶段。在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信。

17.1. 协议

TLS 包含几个子协议,比较常用的有记录协议、警报协议、握手协议、变更密码规范协议等。

17.1.1. 记录协议

记录协议(Record Protocol)规定了 TLS 收发数据的基本单位记录(record)。

17.1.2. 警报协议

警报协议(Alert Protocol)用于提示协议交互过程出现错误。

17.1.3. 握手协议

握手协议(Handshake Protocol)是 TLS 里最复杂的子协议,在握手过程中协商 TLS 版本号、随机数、密码套件等信息,然后交换证书和密钥参数,最终双方协商得到会话密钥,用于后续的混合加密系统。

17.1.4. 变更密码规范协议

变更密码规范协议(Change Cipher Spec Protocol)是一个“通知”,告诉对方,后续的数据都将使用加密保护。

17.2. 交互过程

  • Client Hello:Client Hello 由客户端发送,内容包括客户端的一个Unix时间戳(GMT Unix Time)、一些随机的字节(Random Bytes),还包括了客户端接受的算法类型(Cipher Suites)。
  • Server Hello:Server Hello 由服务端发送,内容包括服务端支持的算法类型、GMT Unix Time以及Random Bytes。
  • Certificate:由服务端或者客户端发送,发送方会会将自己的数字证书发送给接收方,由接收方进行证书验证,如果不通过的话,接收方会中断握手的过程。一般跟在Client / Server Hello报文之后。
  • Server Key Exchange:由服务端发送,将自己的公钥参数传输给了客户端,一般也和Server Hello与Certificate在一个TCP报文中。
  • Server Hello Done:服务端发送,一般也和Server Hello、Certificate和Server Key Exchange在一个TCP报文中。
  • Client Key Exchange:客户端发送,向服务端发送自己的公钥参数,与服务端协商密钥。
  • Change Cipher Spec:客户端或者服务端发送,紧跟着Key Exchange发送,代表自己生成了新的密钥,通知对方以后将更换密钥,使用新的密钥进行通信。
  • Encrypted Handshake Message:客户端或者服务端发送,紧跟着Key Exchange发送。进行测试,一方用自己的刚刚生成的密钥加密一段固定的消息发送给对方,如果密钥协商正确无误的话,对方可以正确解密。
  • New Session Ticket:服务端发送,表示发起会话,在一段时间之内(超时时间到来之前),双方都以刚刚交换的密钥进行通信。从这以后,加密通信正式开始。
  • Application Data:使用密钥交换协议协商出来的密钥加密的应用层的数据。
  • Encrypted Alert:客户端或服务端发送,意味着加密通信因为某些原因需要中断,警告对方不要再发送敏感的数据。

17.3. 版本更新内容

17.3.1. TLS 1.3

  • 引入了PSK作为新的密钥协商机制
  • 支持 0-RTT 模式,以安全性降低为代价,在建立连接时节省了往返时间
  • ServerHello 之后的所有握手消息采取了加密操作,可见明文减少
  • 不再允许对加密报文进行压缩、不再允许双方发起重协商
  • DSA 证书不再允许在 TLS 1.3 中使用
  • 删除不安全的密码算法* RSA 密钥传输 - 不支持前向安全性
    • CBC 模式密码 - 易受 BEAST 和 Lucky 13 攻击
    • RC4 流密码 - 在 HTTPS 中使用并不安全
    • SHA-1 哈希函数 - 建议以 SHA-2 取而代之
    • 任意 Diffie-Hellman 组- CVE-2016-0701 漏洞
    • 输出密码 - 易受 FREAK 和 LogJam 攻击

17.4. 子协议

SSL/TLS协议有一个高度模块化的架构,分为很多子协议,主要是:

  • Handshake 协议* 包括协商安全参数和密码套件、服务端身份认证(客户端身份认证可选)、密钥交换
  • ChangeCipherSpec 协议* 一条消息表明握手协议已经完成
  • Alert 协议* 对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型的错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
  • Record 协议* 包括对消息的分段、压缩、消息认证和完整性保护、加密等

17.5. 参考链接

下一节:IPsec(IP Security)是IETF制定的三层隧道加密协议,它为Internet上传输的数据提供了高质量的、可互操作的、基于密码学的安全保证。