TLS握手过程

本文详细介绍了TLS握手过程,包括RSA和DHE_RSA两种方式。RSA握手存在前向安全性问题,一旦服务器私钥泄露,历史通信内容可能被解密。而DHE_RSA利用迪菲-赫尔曼密钥交换实现前向安全性,即使私钥泄露,已加密通信内容仍安全。实际应用中,TLS更常采用DHE_RSA或ECDHE_RSA。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TLS握手过程

客户端与服务器商议通信密钥的过程称为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中派生出来用做对称加密算法的密钥,握手阶段结束后,通信内容开始使用密钥加密并签名,确保有同样知道密钥的人才能解密内容,从而避免被窃听和篡改的风险。

安全问题

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

通信过程中,客户端和服务器之间的某个网络节点,将所有与

### 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、付费专栏及课程。

余额充值