SSL / TLS 以及 TLS 握手概念

1. 关于本笔记

本文件介绍的是 SSL / TLS 以及 TLS 握手相关知识。

2. 目录

3. 内容

SSL / TLS 以及 SSL / TLS 握手的概念

SSL 和 TLS 协议可以为通信双方提供识别和认证通道,从而保证通信的机密性和数据完整性。

TLS 协议是从 Netscape SSL 3.0 协议演变而来的,不过这两种协议并不兼容。SSL 已经逐渐被 TLS 取代,所以下文就以 TLS 指代安全层。

TLS 握手是启动 HTTPS 通信的过程,类似于 TCP 建立连接时的三次握手。

在 TLS 握手过程中,通信双方交换消息以相互验证、相互确认,并确立它们所要使用的加密算法以及会话密钥(用于对称加密的密钥)。

可以说,TLS 握手是 HTTPS 通信的基础部分。

TLS 握手过程中发生了什么

TLS 握手的目的是建立安全连接,通信双方主要完成以下事情:

  1. 商定双方通信所使用的 TLS 版本(例如 TLS1.0、1.2、1.3 等)。
  2. 确定双方所要使用的密码组合。
  3. 客户端通过服务器公钥和数字证书上的数字签名验证服务端身份。
  4. 生成会话密钥,该密钥用于握手结束后的对称加密。

TLS 握手过程中的一些重要概念

数字证书(digital certificate)

在非对称加密通信过程中,服务器需要将公钥发送给客户端。这个过程里,公钥可能会被第三方拦截并替换,然后第三方就可以冒充服务器与客户端通信,这就是“中间人攻击”。

解决这个问题的方法是引入受信任第三方(CA):

  • 服务器不直接向客户端发送公钥。
  • CA 根据服务器公钥和其它信息生成数字证书(明文)。
  • CA 对证书摘要进行私钥签名,得到数字签名。
  • 服务器将证书和签名一并发送给客户端。

数字证书一般包含以下内容:

  • 证书所有者公钥
  • 证书所有者专有名称
  • 证书颁发机构专有名称
  • 证书有效起始日期
  • 证书过期日期
  • 证书数据格式版本号
  • 证书序列号(由颁发机构分配的唯一标识)

数字签名(digital signature)

数字签名与手写签名类似,用于确保数据发送者身份合法,并确保数据未被篡改。

数字签名生成与验证流程:

  1. 服务器对证书内容计算摘要(如 SHA-256),再使用私钥对摘要加密生成数字签名。
  2. 服务器把数字证书与数字签名一起发送给客户端。
  3. 客户端用 CA 公钥解密数字签名,得到摘要信息。
  4. 客户端用同样摘要算法重新计算证书摘要并比对。
  5. 摘要一致则证书未被篡改,否则验证失败。

证书链(certificate chain)

证书链(信任链,Chain of Trust)是指一系列数字证书的有序连接,它构成了从最终实体证书(如服务器证书)到受信任根 CA 证书的路径。

构成规则:

  • 链中每个证书(除根证书)都由上一级证书私钥签发。
  • 链顶端是自签名根证书,作为信任锚点,被操作系统和浏览器预置信任。

示例:

服务器证书(由中间 CA 签发) <- 中间 CA 证书 <- 更上层中间 CA 证书 <- 根 CA 证书(自签名并被系统信任)

证书链的作用:

  • 建立并传递信任:将“根 CA 信任”延伸到最终服务器证书。
  • 缓解根 CA 私钥风险:根 CA 可离线保护,由中间 CA 承担日常签发。
  • 提高管理灵活性与扩展性:支持分层管理与大规模签发。
  • 支持多场景身份验证:服务器证书、客户端证书、代码签名等。

证书链验证过程简述:

  1. 收集证书:客户端获取服务器证书与中间 CA 证书。
  2. 构建链条:向上追溯到本地受信任根 CA。
  3. 逐级验证:检查签名、有效期、吊销状态、用途约束、域名匹配(服务器证书)。
  4. 最终信任:整条链验证通过且可回溯到受信任根 CA,则服务器身份可信。

核心思想:

客户端持有“根信任”,沿链条逐级验证,确认信任路径完整、有效且未被篡改。

密码规范和密码组合(CipherSpecs 和 CipherSuites)

通信双方在安全连接中使用的算法必须符合密码协议规范。

  • CipherSpecs:定义认证加密算法和摘要算法规范。
  • CipherSuites:定义 SSL / TLS 连接中使用的加密算法组合。

CipherSuites 通常包含三类算法:

  1. 握手阶段密钥交换和认证算法(常见如 RSA)。
  2. 握手完成后的对称加密算法(如 AES、3DES)。
  3. 信息摘要算法(如 SHA-256、SHA-1、MD5)。

TLS 握手详细过程

下图展示了 TLS 握手概念流程:

TLS握手流程

流程说明:

  1. 客户端发送 client hello(握手请求),包含支持的 TLS 版本、密码组合、client random
  2. 服务器返回 server hello(响应),包含证书、选定密码组合、server random
  3. 客户端验证服务器证书(签名、证书链、有效期、吊销状态等)。
  4. 客户端生成 premaster secret,用服务器公钥加密后发送。
  5. 服务器使用私钥解密 premaster secret
  6. 双方使用 client randomserver randompremaster secret 通过同一算法生成共享密钥 KEY
  7. 客户端发送使用 KEY 加密的 finished 消息。
  8. 服务器发送使用 KEY 加密的 finished 消息。
  9. 握手完成,双方建立可信身份与共享会话密钥。
  10. 后续业务数据通过对称加密安全传输。

4. 总结

TLS 握手的核心目标是:

  • 协商安全参数(协议版本、密码组合)
  • 验证通信身份(证书、签名、证书链)
  • 安全生成共享会话密钥(用于后续对称加密)

理解数字证书、数字签名和证书链,是理解 HTTPS 安全性的关键。