# 简介

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 生成。 在握手阶段完成后,进入应用阶段。在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信。

# 协议

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

# 记录协议

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

# 警报协议

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

# 握手协议

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

# 变更密码规范协议

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

# 交互过程

# 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

客户端或服务端发送,意味着加密通信因为某些原因需要中断,警告对方不要再发送敏感的数据。

# 版本更新内容

# 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 攻击

# 子协议

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

  • Handshake 协议

    • 包括协商安全参数和密码套件、服务端身份认证 (客户端身份认证可选)、密钥交换
  • ChangeCipherSpec 协议

    • 一条消息表明握手协议已经完成
  • Alert 协议

    • 对握手协议中一些异常的错误提醒,分为 fatal 和 warning 两个级别,fatal 类型的错误会直接中断 SSL 链接,而 warning 级别的错误 SSL 链接仍可继续,只是会给出错误警告
  • Record 协议

    • 包括对消息的分段、压缩、消息认证和完整性保护、加密等

# 参考链接

# RFC

  • RFC 2246 The TLS Protocol Version 1.0
  • RFC 4346 The Transport Layer Security (TLS) Protocol Version 1.1
  • RFC 5246 The Transport Layer Security (TLS) Protocol Version 1.2
  • RFC 6101 The Secure Sockets Layer (SSL) Protocol Version 3.0
  • RFC 6176 Prohibiting Secure Sockets Layer (SSL) Version 2.0
  • RFC 7568 Deprecating Secure Sockets Layer Version 3.0
  • RFC 8446 The Transport Layer Security (TLS) Protocol Version 1.3

# Document

  • Wikipedia Transport Layer Security