TLS握手过程

本文详细介绍了TLS握手过程中RSA和DHE_RSA两种不同方式的工作原理。RSA握手过程中,客户端使用服务器的公钥加密随机数发送给服务器;而在DHE_RSA方式中,双方通过迪菲-赫尔曼密钥交换算法协商出一个共享密钥,即使服务器私钥泄露,也不影响会话密钥的安全。

客户端与服务器商议通信密钥的过程称为TLS握手,在握手阶段,通信内容虽然都是明文,但要保证最终商量的密钥只有客户端和服务器知道,其他中间节点无从得知。

RSA握手过程

RSA握手过程说明:

  • "Client Hello",客户端向服务器发送一个随机数R1
  • "Server Hello",服务器给客户端回复一个随机数R2与包含公钥的证书
  • "Client Key Exchange",客户端用公钥加密一个随机数(premaster secret)发送给服务器
// 生成master secret、以及从master secret中得到session key
masterSecret = generateMasterSecret(R1, R2, premasterSecret);
sessionKey = sessionKeyFrom(masterSecret);
复制代码

第3步,premaster secret由客户端使用公钥加密后发送,拥有私钥的服务器才能解密,所以最终只有客户端与服务端能生成一致的master secret。图中最后的session key是从master serect中派生出来用做对称加密算法的密钥,握手阶段结束后,通信内容开始使用密钥加密并签名,确保有同样知道密钥的人才能解密内容,从而避免被窃听和篡改的风险。

安全问题

上述握手过程,在私钥没有泄漏且证书是可信的前提下,的确能避免通信内容被窃听或篡改。但可能存在一种情况:

通信过程中,客户端和服务器之间的某个网络节点,将所有与服务器相关通信内容(TCP报文)在本地保存一份副本。在当时,由于不知道服务器私钥,无法破解被加密的premaster secret,从而不能解密通信内容。很久以后的某天,服务器的私钥泄漏,导致加密的premaster secret被破解,通信内容被解密,从而引发信息泄漏。

上述RSA握手过程,服务器长期使用的私钥泄漏会导致会话密钥泄漏,从而导致使用会话密钥加密的内容泄漏,即不具有前向安全性,下面介绍一种具有前向安全性的握手过程-DHE_RSA。

DHE_RSA握手过程

DHE_RSA握手过程依赖密钥交换算法-迪菲-赫尔曼密钥交换(Diffie–Hellman key exchange,缩写D-H),它是一种安全协议,可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。

DH算法简要原理摘录:

  • person a has secret a, sends ga to person b
  • person b has secret b, sends gb to person a
  • person a computes (gb)a
  • person b computes (ga)b
  • Both person a and b end up with gab, which is their shared secret

DHE_RSA握手过程说明:

  • "Client Hello",客户端向服务器发送一个随机数R1
  • "Server Hello",服务器给客户端回复一个随机数R2与包含公钥的证书
  • "Server Key Exchange",服务端挑选一个server-DH参数(ga),发送给客户端,并且包含私钥对内容的签名,客户端可用第2步证书中的公钥验证内容未被篡改
  • "Client Key Exchange",客户端挑选一个client-DH参数(gb),发送给服务端

第4步后,双方都能计算出premaster secret(gab),从而得到master secret以及session key。在这种方式下,服务器私钥只在第3步中签名使用,哪怕泄漏,通讯双方的秘密(a、b)也不会泄漏。

提到TLS握手,大部分网上文章讲的都是RSA方式,但现实中单纯使用RSA握手过程的TLS几乎没有,更多的应该是DHE_RSA或ECDHE_RSA,ECDHE_RSA原理与DHE_RSA区别不大,只是借助椭圆曲线(Elliptic Curve)减少计算量,提高性能。

tips: 通过chrome调试窗口"Security"标签页,可以看到握手过程的具体算法,如:"a strong key exchange (ECDHE_RSA with P-256)"。

参考资源: - Keyless SSL: The Nitty Gritty Technical Details

博客原文

转载于:https://juejin.im/post/5b45d2536fb9a04fb309e976

### SSL/TLS 握手过程详解 #### 一、握手的目标 TLS/SSL 握手的主要目标是在客户端和服务器之间建立一个安全的通信通道。这个通道通过保密性(Confidentiality)、完整性(Integrity)以及身份验证(Authentication)来保护数据传输[^1]。 #### 二、基本流程概述 整个握手过程可以分为以下几个阶段: 1. **客户端问候 (Client Hello)** 客户端发起连接请求,发送 `Client Hello` 消息给服务器。此消息包含支持的协议版本、加密套件列表以及其他参数(如随机数)。这些信息用于后续的安全配置[^2]。 2. **服务器响应 (Server Hello 和证书)** 服务器接收到 `Client Hello` 后返回自己的 `Server Hello` 响应,其中包括选定的协议版本、加密算法和其他必要参数。随后,服务器还会提供其数字证书以证明自己身份的真实性。如果使用 RSA 密钥交换,则无需额外的消息;如果是其他类型的密钥交换方式可能还需要进一步交互[^1][^2]。 3. **公钥验证与预主密钥生成** 客户端接收到来自服务端的信息之后,会对所提供的 X.509 数字证书进行校验,确认无误后再利用其中所含有的公共密钥加密一段预先产生的秘密值——即所谓的 “pre-master secret”。然后把这个经过加密处理后的 pre-master secret 发送给服务器[^1]。 4. **计算共享主密钥** 双方各自基于之前获得的数据独立推导出相同的 session key 或 master secret 。这一操作依赖于 Diffie-Hellman 算法或其他类似的机制完成最终对称加密所需的材料准备[^2]。 5. **变更密码规格通知 Change Cipher Spec** 当双方都准备好切换至新的加密模式时,分别发出一条特殊的控制命令叫做 change cipher spec message ,表示接下来所有的通讯都将采用新协商出来的设置来进行加解密工作[^1]。 6. **Finished Message 验证成功与否** 最后一步就是互相传递 finished messages 来检验前面所有步骤是否正确执行完毕。只有当彼此都能够解读对方发来的这条特殊消息的时候才意味着整个 handshake 过程圆满结束,并正式开启受保护状态下的正常业务往来活动[^2]。 #### 三、代码示例模拟简单场景 下面是一个非常简化的 Python 脚本来展示如何构建 Client Hello 请求并解析 Server Hello 返回的内容: ```python import socket from ssl import SSLContext, PROTOCOL_TLSv1_2 def create_tls_handshake(host='www.example.com', port=443): context = SSLContext(PROTOCOL_TLSv1_2) with socket.create_connection((host, port)) as sock: with context.wrap_socket(sock, server_hostname=host) as ssock: print(f"Connected to {ssock.server_hostname}") print("Cipher used:", ssock.cipher()) create_tls_handshake() ``` 以上脚本仅作为演示用途,在实际应用环境中应当考虑更多细节因素比如错误捕获等等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值