SSL/TLS

SSL/TLS 握手的全部步骤

  1. 客户端 Hello(Client Hello)

    • 客户端向服务器发送 Client Hello 消息,包含以下信息:
      • 支持的 SSL/TLS 版本(例如 TLS 1.2 或 TLS 1.3)
      • 支持的加密套件(cipher suites)
      • 支持的压缩方法(compression methods)
      • 客户端生成的随机数(client random)
      • 会话 ID(如
      • V果是重新连接)
  2. 服务器 Hello(Server Hello)

    • 服务器响应 Client Hello,发送 Server Hello 消息,包含以下信息:
      • 服务器选择的 SSL/TLS 版本
      • 服务器选择的加密套件
      • 服务器选择的压缩方法
      • 服务器生成的随机数(server random)
      • 会话 ID(如果是重新连接)
  3. 服务器证书(Server Certificate)

    • 服务器发送其数字证书(包含公钥和由 CA 签名的信息)给客户端。这是用于客户端验证服务器身份的重要步骤。
  4. 服务器密钥交换(Server Key Exchange)

    • 如果服务器选择的加密套件需要额外的密钥交换信息(例如使用 Diffie-Hellman 密钥交换),服务器会发送密钥交换消息。这包括服务器生成的密钥交换参数。
  5. 服务器 Hello Done

    • 服务器发送 Server Hello Done 消息,标志着服务器端的握手消息发送完毕。
  6. 客户端证书(Client Certificate)

    • 如果服务器要求客户端进行身份验证,客户端会发送其数字证书。此步骤是可选的,取决于服务器的要求。
  7. 客户端密钥交换(Client Key Exchange)

    • 客户端生成一个预主密钥(pre-master secret),用服务器的公钥加密后发送给服务器。这个密钥用于生成会话密钥。
  8. 证书验证(Certificate Verify)

    • 如果客户端提供了证书,它会用私钥对之前的所有握手消息进行签名,证明其身份。
  9. 客户端 Finished

    • 客户端发送 Change Cipher Spec 消息,通知服务器后续消息将使用协商的加密套件进行加密。接着发送 Finished 消息,验证之前的握手消息没有被篡改。
  10. 服务器 Finished

    • 服务器收到客户端的 Finished 消息后,发送 Change Cipher Spec 消息,通知客户端服务器也将使用协商的加密套件进行加密通信。接着发送 Finished 消息,验证握手过程中的消息没有被篡改。
  11. 数据传输

    • 握手完成后,客户端和服务器使用协商的会话密钥进行加密数据传输。

密钥的组成、生成及验证

  1. 预主密钥的生成和使用
  • 生成: 预主密钥(pre-master secret)是由客户端生成的一个随机值。在客户端的密钥交换消息中,客户端生成一个随机的预主密钥,并使用服务器的公钥对其进行加密。加密后的预主密钥被发送给服务器。

  • 解密: 服务器使用其私钥解密预主密钥,恢复原始值。

  1. 会话密钥的生成
  • 生成 : 会话密钥由客户端和服务器基于预主密钥和握手过程中交换的随机数(client random 和 server random)生成。具体步骤如下:
    • 使用伪随机函数(PRF, Pseudo-Random Function),该函数通常基于哈希函数(如 SHA-256)和密钥派生函数(KDF)。
    • PRF 输入包括:预主密钥、客户端和服务器生成的随机数。
    • PRF 输出是多个会话密钥,包括对称加密密钥、消息认证码(MAC)密钥和初始化向量(IV)。
  1. 会话密钥的验证
  • 验证握手消息 : 客户端和服务器在握手的最后阶段通过 Finished 消息来验证会话密钥。Finished 消息的内容是对握手过程中所有消息的哈希值(使用会话密钥加密)。这样可以确保握手过程没有被篡改。
    • 客户端和服务器都会计算 Finished 消息,并进行比对。如果计算出的 Finished 消息一致,则表明握手过程没有被篡改,且会话密钥生成正确。

总结

对于开发者而言,虽然 SSL/TLS 握手过程的细节和密钥管理是透明的,但了解这些过程有助于理解 HTTPS 的安全性,帮助识别和解决可能的安全问题。在实际应用中,SSL/TLS 握手由库或框架处理,开发者通常只需要关注配置和调试,而无需直接操作握手过程的各个步骤。

相关推荐
司机20487 小时前
将virtuoso原理图信息导出到json文件
json·github
Mo_YuO.o8 小时前
git的安装以及本地仓库的创建
git·gitee·github
CoderJia程序员甲8 小时前
GitHub 热榜项目 - 日榜(2026-01-19)
git·ai·开源·llm·github
petunsecn15 小时前
多 GitHub 账号与多平台 Git 使用
github
一口面条一口蒜15 小时前
R 包构建 + GitHub 部署全流程
开发语言·r语言·github
ONLYOFFICE16 小时前
树莓派办公套件:ONLYOFFICE 桌面编辑器安装教程
编辑器·github·onlyoffice
AlenTech16 小时前
Ubuntu 系统,防止运行大项目的时候 SSH 突然断开
ubuntu·ssh·github
深兰科技16 小时前
俄罗斯T1集团代表团到访深兰科技,就具身智能与复杂场景工程化应用达成多项合作共识
windows·ci/cd·github·visual studio·具身智能·深兰科技·俄罗斯t1集团
企业对冲系统官17 小时前
期货套保系统移动端操作的技术架构与实现
算法·架构·区块链·github
与光同尘 大道至简2 天前
ESP32 小智 AI 机器人入门教程从原理到实现(自己云端部署)
人工智能·python·单片机·机器人·github·人机交互·visual studio