GENEARE BY SD
Published on

SSL/TLS 握手流程详解

SSL/TLS 握手流程详解

SSL(Secure Sockets Layer)和它的继任者 TLS(Transport Layer Security)是互联网上最广泛使用的加密协议。本文将详细介绍 SSL/TLS 握手的完整流程。

安全

机密性、完整性,身份认证和不可否认

  • 机密性(Secrecy/Confidentiality)是指对数据的“保密”,只能由可信 的人访问,对其他人是不可见的“秘密”,简单来说就是不能让不相关的 人看到不该看的东西。

  • 完整性(Integrity,也叫一致性)是指数据在传输过程中没有被窜改。

  • 身份认证(Authentication)是指确认对方的真实身份,也就是“证明你真的是你”,保证消息只能发送给可信的人。

  • 不可否认(Non-repudiation/Undeniable),也叫不可抵赖

加密方式概述

在了解 SSL/TLS 握手流程之前,我们需要先理解两种基本的加密方式:对称加密和非对称加密。

对称加密

对称加密使用相同的密钥进行加密和解密:

  • 优点
    • 加密速度快
    • 计算资源消耗少
    • 适合大量数据传输
  • 缺点
    • 密钥分发困难
    • 密钥管理复杂
    • 安全性相对较低
  • 常见算法:AES、DES、3DES

非对称加密

非对称加密使用一对密钥:公钥和私钥:

  • 优点
    • 安全性高
    • 密钥分发简单
    • 可实现数字签名
  • 缺点
    • 加密速度慢
    • 计算资源消耗大
    • 不适合大量数据传输
  • 常见算法:RSA、ECC、DSA

SSL/TLS 中的混合加密

SSL/TLS 协议巧妙地结合了两种加密方式的优点:

  1. 密钥交换阶段
    • 使用非对称加密安全传输会话密钥
    • 解决了对称加密密钥分发的问题
  2. 数据传输阶段
    • 使用对称加密进行实际数据传输
    • 保证了通信效率
    • 降低了资源消耗

这种混合加密方式既保证了密钥交换的安全性,又确保了数据传输的效率。

密钥的来源和分配

在 SSL/TLS 握手过程中,涉及到的密钥来源如下:

握手流程概述

SSL/TLS 握手是客户端和服务器在进行加密通信之前建立安全连接的过程。整个过程可以分为以下几个关键步骤:

  1. Client Hello

    • 客户端向服务器发送第一个握手消息
    • 包含支持的 SSL/TLS 版本
    • 支持的加密套件列表
    • 随机数(Client Random)
  2. Server Hello

    • 选择使用的 SSL/TLS 版本
    • 选择使用的加密套件
    • 服务器生成的随机数(Server Random)
    • 服务器的数字证书
      • 证书中包含了对签发者、签发时间、公钥、签名算法等信息的签名(Hash1),并用CA的私钥进行加密(EHash1),用于验证证书是否被篡改
  3. **server key exchange **

    • 如果使用ECDHE算法,那么这一步会发送算法所需要的参数(server params)包括椭圆曲线的参数G以及一个公钥Server_Q
      • 这一步中服务端生成临时的私钥ServerPrivate
      • G · ServerPrivate = Server_Q。把Server_Q发送给客户端
    • 如果使用RSA算法,这一步会被省略
  4. server hello done

    • 服务器表示消息发完了
  5. 证书验证

    • 客户端逐级验证服务器证书是否由受信任的根 CA 签发、是否在有效期内、域名是否匹配
    • 客户端从证书中提取签名算法,用这个算法对证书的内容计算签名(Hash2)并使用CA的公钥解密EHash1,比较Hash1和Hash2是否一致,确认证书是否被篡改
    • OCSP 协议或 CRL 列表查询证书是否被 CA 主动吊销
  6. client key exchange

    • 如果使用ECDHE算法,那么这一步客户端发送算法所需要的参数(client params)

      • 这一步中服务端生成临时的私钥ClientPrivate
      • G · ClientPrivate = Client_Q。把Client_Q发送给服务端
    • 现在客户端和服务端根据(client params)和(server params)生成Pre-Master

      • Pre-Master = ClientPrivate · Server_Q = ServerPrivate · Client_Q = ClientPrivate · ServerPrivate · G
    • 然后根据pre-master、clinet Random和server Random生成master secret

    • 上面这些步骤中私钥都没有发送出去,所以能够保证安全

    • 如果使用RSA算法,这一步客户端直接用证书中的公钥加密pre-master,然后发送给服务端

  7. client change ciper spec

    • 客户端通知服务器,接下来的通信将使用对称加密
    • 发送之前所有的消息并进行签名
  8. serverr change ciper spec

    • 服务端通知服务器,接下来的通信将使用对称加密
    • 发送之前所有的消息并进行签名