IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> SSL/TLS握手协议概述 -> 正文阅读

[网络协议]SSL/TLS握手协议概述

请添加图片描述

??SSL/TLS专栏导航页??


TLS协议中存在连接和会话的概念,会话上的加密信息是通过TLS握手协议进行协商的。

  • 连接代表一种特定的通信通道(通常映射为TCP 连接),以及密钥、加密选择和序号状态等内容。
  • 会话则是一种虚拟的结构,它代表磋商好的算法和pre_master_secret 。

每次当给定的客户端与服务器经过完整的密钥交换并确立新的master_secret 时就会创建一个会话。一个给定的会话可以与多条连接关联。尽管给定会话中的所有连接均共享同一个master_secret,但是每个连接又都有它自己的加密密钥,MAC 密钥和IV。因此他们互相也是安全的。

当TLS的客户端和服务器开始进行TLS握手时,它们会就TLS协议标准、加密算法、认证算法进行协商,然后使用公钥加密等技术生成共享密钥。

TLS握手协议包含下面几个步骤:

  • 交换hello报文信息协商算法信息、交换随机数、检查会话是否可复用;
  • 交换必要的加密参数从而协商出主密钥;
  • 交换证书和加密信息完成客户端和服务端的身份认证;
  • 通过预主密钥(PreMasterKey)和双方随机数(client Random, Server Random)生成主密钥(MasterKey);
  • 为记录层(Record Layer)提供安全参数
  • 允许客户端和服务器验证是否生成相同的安全参数;此外还可以确认是否存在攻击者

实际在TLS握手交互过程中,根据选择的算法和配置情况交互报文略有不同。如:

  • 客户端证书在大多数情况下并不用发送。这个与应用场景有关,但我们使用浏览器登录一个普通网页时并不需要双向认证。那么什么时候会进行双向认证呢? 一般是在重要场合(特别是涉及RMB的场合),这个时候需要双向认证,双方互相发送证书。
  • 根据密钥配送算法的不同,TLS握手流程也不相同。关于密钥配送算法,在番外篇中进行介绍。
  • 是否复用Session

下面分别对完整的TLS握手流程、复用session时的握手流程做一个介绍。

1. TLS 握手完整流程:

  • 客户端发送一个Client Hello消息给服务端;服务端必须响应一个Server Hello消息,或者严重错误消息,以此来中断连接。客户端和服务器端的hello消息用来协商:版本信息、SessionID、加密套件、压缩算法。除此之外还会生成两个随机数并互相交换:Client Random, Server Rrandom。
  • Key exchange最多使用四个报文。分别是:Server Certificate、Server Key Exchange、Client Certificate、 Client Key Exchange。此外还可以增加新的密钥交换方式。密钥长度一般足够长(48~128bytes之间)
  • 紧随Server Hello报文的是服务端证书载荷。除此之外,服务器端可能根据需求发送Server Key Exchange载荷(非强制)。如果服务器端同时想要验证客户端的身份,需要发送一个CertificateRequest载荷,最后发送一个ServerHelloDone载荷表示hello报文的协商阶段结束,服务端开始等待客户端的响应。
  • 客户端处理完毕ServerHello系列报文后,发送ClientKeyExchange报文作为回应。此外根据服务端的要求来确定是否发送客户端证书载荷。如果需要发送且发送的客户端证书具有签名功能,则需要再发送一个数字签名验证载荷来验证证书。之后进行发送密钥更换通知载荷、最后在新算法、密钥的保护下发送Finish消息
  • 服务端收到消息后发送自己的密钥变更载荷,最后在新密码算法的保护下发送Finish载荷。

至此,TLS握手结束。

TLS完整握手流程如下:

RFC4346

对于可复用Session, TLS握手流程有所不同。

2. Session复用时TLS握手流程:

整个TLS 握手的开销可能非常巨大,无论从CPU 时间还是执行所需要的往返次数上讲均是如此。为了减少这种性能开销,在TLS中集成进了一种会话恢复机制。如果客户端与服务器已经通信过一次,则它们就可以跳过整个握手阶段而直接进行数据传输。握手中开销最昂贵的部分就是确立 pre_master_secret,它通常要求使用公用密钥加密。而经过恢复的握手允许新的连接使用上一次握手中确立的pre_master_secret。这就避免了公用密钥加密所需的计算开销昂贵的操作。

当客户端与服务器第一次进行交互时,它们创建一个新的连接和一个新的会话。如果务器准备恢复会话的话,就会在ServerHello 消息中给客户端一个session_id,并master_secret 缓存起来供以后引用。当这个客户端与服务器的创建新连接时,客户端在Client Hello报文中填充SessionID载荷,如果此项不为0,表示客户端想复用此SessionID的安全参数信息。服务端如果同意复用此Session,则可以在ServerHello中填入相同的SessionID值。之后客户端和服务端跳过后续握手流程,立即发送ChangeCipherSpec载荷,之后立即发送Finish载荷完成TLS的协商。

Session复用时TLS握手流程如下:image-20210912172119993

如果此sessionID在服务端中不可用,则服务端重新生成一个新sessionID,之后进行完整的TLS参数协商。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 10:36:22  更:2021-09-18 10:36:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:31:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码