练习实践-TLS02-会话恢复的两种形式-Session ID/SessionTicket

参考来源:
书籍:深入浅出https-从原理到实战(作者:虞卫东)
抓包分析文件可下载,来自github上的作者上传资源

会话恢复机制的背景

当客户端和服务器端握手成功,建立了一个完整的 TLS 连接,只要客户端和服务器端
不主动关闭该连接,HTTPS 的应用层数据请求就一直受该 TLS 连接保护,一旦客户端和
服务器端关闭该连接,那么客户端下次访问 HTTPS 网站的时候就要进行一次新的连接
造成了极大的网络延迟,并消耗客户端和服务器端的运算能力
有没有一种机制能够复用先前的 TLS 连接呢?或者说能否恢复先前的 TLS 会话呢?
在 TLS/SSL 协议中,可以使用会话恢复机制。

一个完整的会话(Session)包括什么呢?

握手协议完成后,服务器端会在内存中保存会话信息,包括如下部分。
◎ 会话标识符(session identifier):每个会话都有唯一编号。
◎ 证书(peer certificate):对端的证书,一般情况下都为空。
◎ 压缩算法(compression method):一般不启用。
◎ 密码套件(cipher spec):客户端和服务器端协商出的密码套件。
◎ 主密钥(master secret):每个会话会保存一个主密钥,注意不是预备主密钥。
◎ 会话可恢复标识(is resumable):表示某个会话是否可恢复。
通过服务器保存的会话信息,最终能够生成 TLS 记录层协议所需要的加密参数
(security parameters),从而能够保护应用层的数据。

Session ID 的工作原理

在了解会话恢复之前,先回顾一下完整握手过程
◎ 客户端发送 Client Hello 消息,其中传递的 Session ID 值为空。
◎ 服务器端检查客户端的 Session ID 值,如果该值为空,则进行完整的握手。生成一个新的 Session ID,该值通过服务器端的 Server Hello 消息传递给客户端。
◎ 客户端接收到服务器端的 Session ID 值后,会记录在内存中,也就是说客户端仅仅在内存中保存一个 Session ID 值。
◎ 服务器端和客户端完整处理 Finished 消息后,代表一个完整的会话结束,服务器端将会话信息保存 Session Cache 中,健值就是 Session ID,健值对应的内容就是会话信息。

基于 Session ID 的会话恢复处理流程

图pass

基于流程,描述下客户端和服务器端是如何处理的。
◎ 客户端再次请求相同的网站,如果该网站对应的 Session ID 值不为空,则 Client
Hello 消息附带该值。
◎ 服务器接收到该请求后,检查 Session Cache 是否能够匹配健值为 Session ID 的会
话,如果没有或者不可恢复会话,则进行完整的握手协议,同时生成一个新的
Session ID 返回给客户端。
◎ 服务器端如果能够恢复本次连接,则直接发送 ChangeCipherSpec 和 Finished 子消息,不进行密码协商,因为主密钥存在于 Session Cache 中。
◎ 最终客户端也发送 ChangeCipherSpec 和 Finished 子消息,表示会话恢复成功。基于 Session ID 的会话恢复主要由服务器端存储会话信息,该方式很早以前就存在于

TLS/SSL 协议中,大部分客户端和服务器端都支持这种恢复方式。

会话恢复需要注意的点:
◎ 即使客户端和服务器端能够恢复出上次连接的主密钥,客户端和服务器端最终生
成的密钥块和先前的密钥块是不一样的,主要原因就在于通过 PRF 生成密钥块的
时候,客户端和服务器端的随机数不同于前一次连接,这也有效地增强了安全性。
◎ 在恢复会话完成后,也要校验客户端和服务器端的 Finished 消息,避免握手消息
篡改。
◎ 恢复会话的时候,本次连接协商出的密码套件必须和会话中的密码套件是一致
的,否则就要进行完整的握手。
◎ 是否恢复成功取决于客户端和服务器端,即使存在可以恢复的会话,服务器也可
以要求进行完整的握手。
◎ 会话中并不保存扩展信息,所以每个扩展必须充分考虑会话恢复的情况。
◎ Session ID 是明文传输的,服务器 Session ID 不应该包含隐私数据,Session ID 也
很容易篡改或者伪造,不过有 Finished 消息的存在,一般不会遇到攻击。

客户端可以发送的 Session ID 来源

1)上一次完成握手后客户端记录的 Session ID
这种情况很好理解,比如用户间隔一段时间再次访问某个该网站,客户端就可以传递该 Session ID。
2)客户端使用另外一条连接正在使用的 Session ID
现代浏览器一般允许同时有多个连接请求,以便进行并行处理,某一条连接完成生成
一个 Session ID 后,客户端另外一条连接就可以发送该 Session ID,也就是相同时间点发送的连接可以包含同样的 Session ID。
3)客户端可以使用当前连接的 Session ID
只要客户端接收到服务器端 Server Hello 消息的 Session ID,就可以在下个连接中立刻发送该 Session ID。

Session ID 的优缺点

1)Session ID 会话恢复的好处
◎ 减少网络延迟,通过交互图可以看出完整握手协议需要两个 RTT(一次消息往
返),而简短的握手则减少了一个 RTT。
◎ 减少了客户端和服务器端的负载,握手协议耗时的操作在于密码学的运算,尤其
是密钥协商需要消耗大量的 CPU 运算,而简单的握手并不需要进行密钥协商。
2)Session ID 会话恢复的缺点
◎ 由服务器存储会话信息,这极大地限制了服务器的扩展能力,为了避免占用太多
的内存,要充分考虑会话的生命有效期。
◎ TLS/SSL 协议只是规定 Session Cache 的存储方式,没有考虑如何实现 Session
Cache。
大部分 Web 服务器都是基于底层的 OpenSSL 库实现的 Session Cache,没有考虑多个
主机共享 Session Cache 的问题
总体来说,服务器存储和不支持分布式 Session Cache 极大限制了会话恢复效果,所
以接下来介绍一种新的会话恢复方式,那就是 SessionTicket。

第二种会话恢复方式-SessionTicket介绍

SessionTicket 是另外一种会话恢复方式,解决了 Session ID 会话恢复存在的缺点,是
一种更好的会话恢复方式。
SessionTicket 的处理标准定义在 RFC 5077 中,在 TLS/SSL 协议中,SessionTicket 以
TLS 扩展的方式完成会话恢复,SessionTicket 扩展的实现定义在 RFC 4507 上。

SessionTicket 的应用场景

SessionTicket 主要解决 Session ID 会话恢复存在的问题,如果遇到以下问题,那么特
别适合使用 SessionTicket。
◎ Session ID 会话信息存储在服务器端,对于大型 HTTPS 网站来说,占用的内存量
非常大,是非常大的开销。
◎ HTTPS 网站提供者希望会话信息的生命周期更长一点,尽量使用简短的握手。
◎ HTTPS 网站提供者希望会话信息能够跨主机访问,Session ID 会话恢复显然不能。
◎ 嵌入式的服务器没有太多的内存存储会话信息。
如果遇到以上问题,那么使用 SessionTicket 显然是合适的

SessionTicket 的交互流程

SessionTicket 从应用的角度来看,原理很简单,服务器将会话信息加密后以票据
(ticket)的方式发送给客户端,服务器本身不存储会话信息。客户端接收到票据后将其存
储到内存中,如果想恢复会话,则下一次连接的是将票据发送给服务器端,服务器端解密
后,如果确认无误则表示可以进行会话恢复,完成了一次简短的握手。
相对于 Session ID 的恢复来说,有两点的改变:
◎ 会话信息由客户端保存
◎ 会话信息需要由服务器端解密,客户端不参与解密过程,只负责存储和传输
SessionTicket 在具体实现的时候,其实有多种情况,接下来一一说明。

图pass

1.基于Session Ticket进行完整的握手

(1)对于一次新连接,如果期望服务器支持 SessionTicket 会话恢复,则在客户端 Client
Hello 消息中包括一个空的 SessionTicket TLS 扩展。
(2)如果服务器支持 SessionTicket 会话恢复,服务器的 Server Hello 消息中也包括一
个空的 SessionTicket TLS 扩展。
(3)服务器端对会话信息进行加密保护,生成一个票据,然后在 NewSessionTicket 子
消息中发送该票据,NewSessionTicket 子消息是握手协议的一个独立子消息。由于是完整
的握手,其他的一些子消息也会正常处理。
(4)客户端收到 NewSessionTicket 子消息后,将票据存储起来,以便下次使用。

2.基于 SessionTicket 进行简短的握手

在这里插入图片描述

(1)客户端存储了一个票据,如果希望恢复会话,则在客户端的 Client Hello 消息中
包括一个非空的 SessionTicket TLS 扩展。
(2)服务器端接收到非空票据后,对票据进行解密校验,如果可以恢复则在服务器
Server Hello 消息中发送一个空的 SessionTicket TLS 扩展。
(3)由于是简短握手,所以 Certificate 和 ServerKeyExchange 等子消息不发送,接下
来发送一个 NewSessionTicket 子消息来更新票据,票据也是有有效期的。
(4)客户端和服务器端接着校验 Finished 子消息则表示简单握手完成,顺利完成会话
恢复。

3.服务器不支持 SessionTicket 的交互流程

客户端发送了非空的 SessionTicket TLS 扩展后,服务器可以选择不支持会话恢复,也
不生成新的票据,为了达到这个目的,可以在服务器端 Server Hello 消息中不响应
SessionTicket TLS 扩展,也不发送 NewSessionTicket 子消息。

4.服务器校验票据失败的流程

客户端发送了非空的 SessionTicket TLS 扩展后,服务器校验失败后,可以重新生成新
的票据支持 SessionTicket,该流程和基于 SessionTicket 进行完整握手的流程差不多,只是
不发送 NewSessionTicket 消息,大概流程如下:
pass

SessionTicket TLS 扩展

理解了 SessionTicket 的交互流程,再理解 SessionTicket TLS 扩展就很容易了。
(1)如果客户端想获得一个票据,可以在客户端 Client Hello 消息中发送一个空的
SessionTicket TLS 扩展。
(2)如果服务器端不想支持 SessionTicket 会话恢复,客户端 Client Hello 消息中不发
送 SessionTicket TLS 扩展即可。
(3)如果服务器端支持生成票据,不管客户端发送的 SessionTicket TLS 扩展是不是为
空,服务器都会发送 NewSessionTicket 子消息,该消息包含一个票据。
(4)服务器端没有接收到客户端的 SessionTicket TLS 扩展,不用进行任何 SessionTicket
处理。

NewSessionTicket 握手子消息

该消息必须在 ChangeCipherSpec 协议发送之前发送,如果服务器端 Server Hello 消
息包含 SessionTicket TLS 扩展,则必须发送该消息;如果服务器端 Server Hello 消息不
包含 SessionTicket TLS 扩展,则不能发送该消息,表示客户端或者服务器端不想使用
SessionTicket 会话恢复机制。

由于该消息也是握手协议的一部分,Finished 子消息校验消息完整性的时候也必须包
含 NewSessionTicket 子消息。

如果服务器端成功校验客户端发送的票据,必须重新生成一个票据,然后通过
NewSessionTicket 子消息发送新票据,客户端在下一次连接的时候应该发送新的票据。
和标准的 TLS/SSL 协议相比,握手协议新增了几个子消息,比如上一节讲解的
CertificateStatus 子消息。

NewSessionTicket 子消息中包含最重要的元素就是票据,票据也有生命周期,服务器
端应该校验票据的有效期,过期的票据不能用于进行会话恢复。

票据的生成完全由服务器端控制,客户端只是传输票据,不涉及票据的解密。
不同的 Web 服务器,票据生成使用的算法也不尽相同,但在实现的时候一定要注意
安全性,一旦票据加密的密钥被破解,则失去了前向安全性。

对于读者来说,了解会话恢复的原理很重要。能够正确通过 Nginx 或者 Apache 部署
即可,会话恢复是提升 HTTPS 性能非常关键的解决方案,也是 HTTPS 的一个重要知识点。

两种会话恢复方式如何共存

基于 Session ID 和 SessionTicket 的会话恢复会不会同时有效果?会不会有冲突?两者
之间的关系比较复杂,简单做下说明。

(1)如果服务器想使用 SessionTicket 机制,那么服务器 Server Hello 可以不发送
session_id。
(2)如果服务器不想使用 SessionTicket 机制,那么不在 Server Hello 消息中包含
SessionTicket 扩展即可,此时应该生成 session_id 发送给客户端。

(3)对于客户端来说,SessionTicket 恢复的优先级应该更高,如果服务器端同时发送
了票据和 session_id,客户端应该不使用 ServerHello.session_id。

(4)如果服务器端同时发送了票据和 ServerHello.session_id,为了方便切换两种会话
恢复方式,客户端应该同时发送票据和 session_id。服务器端接收后,如果在 Session Cache
中存在 session_id,则响应同样的 session_id 给客户端,同时也发送票据给客户端。

总体来说,如何混用两种会话方式取决于客户端和服务器端的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/517316.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

刷题之Leetcode35题(超级详细)

35.搜索插入位置 力扣题目链接(opens new window)https://leetcode.cn/problems/search-insert-position/ 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可…

ChatGPT 与 OpenAI 的现代生成式 AI(下)

原文:Modern Generative AI with ChatGPT and OpenAI Models 译者:飞龙 协议:CC BY-NC-SA 4.0 七、通过 ChatGPT 掌握营销技巧 在本章中,我们将重点介绍营销人员如何利用 ChatGPT,在这一领域中查看 ChatGPT 的主要用例…

jvisualvm 使用教程

之前看过 jvisualvm,但是那个时候对 JVM 并不是很熟悉,后面看了下八股文,看了下 JVM 的相关知识之后,发现多了解点 JVM 的东西,对我们 CRUD 其实是有指导意义的,就比如我们通常会 new 一堆的没有用到的对象…

读所罗门的密码笔记10_寒武纪国家与城堡国家

1. DARPA 1.1. DARPA仍然是世界领先的尖端高科技研究推动者之一,资助研发人员开展各个领域的前沿研究,从自动驾驶汽车到植入式神经芯片,从复杂的系统分析(比如分析气候变化)到网络安全,无一…

31. 下一个排列 —— LeetCode (python) [PS: LeetCode 运行环境疑似出错]

# encoding utf-8 # 开发者:xxx # 开发时间: 20:26 # "Stay hungry,stay foolish."class Solution(object):def nextPermutation(self, nums):import itertoolsl len(nums)a tuple(nums)nums.sort()permutations_lst list(ite…

DDD 的四层领域模型是怎样的?包含哪些基础概念?

DDD的四层领域模型如下所示: 展现层:这一层负责向用户显示信息和解释用户命令,完成前端界面逻辑。并将用户请求传递给应用层。应用层:这一层是很薄的一层,负责协调领域层中的领域对象,组成具体应用场景。应…

JAVA JVM内存模型和GC分配和回收

Java 的JVM简介 JVM是(Java Virtual Machine)Java虚拟机的缩写。 JVM是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 ​ 在Java程序运行时,所有的.class类需要加载到JVM中才能执行代码逻辑。不…

Python环境下基于离散小波变换的信号降噪方法

Mallat创造了小波分析中的经典理论之一,即多分辨率分析的概念。后来,在Mallat与Meyer的共同努力之下,他们又在这一理论的基础上发明了离散小波变换的快速算法,这就是Mallat塔式算法,这种算法可以大量减少计算时间。在之…

解锁未来:大模型GPT的应用架构与创新实践

在人工智能的黄金时代,大模型如GPT(Generative Pre-trained Transformer)已成为技术创新和应用发展的前沿。它不仅重新定义了人机交互的方式,还在多个领域内展现出了巨大的应用潜力。本文将深入探讨大模型GPT的应用架构&#xff0…

深入解析:链游、DApp、公链、NFT与交易所开发的全景图

随着数字货币和区块链技术的迅速发展,链游开发、DApp开发、公链开发、NFT开发以及交易所开发等领域吸引了越来越多的关注。本文将以3000字的篇幅,对这些领域进行详细解析,探讨它们的意义、应用场景以及未来发展趋势。 链游开发(Bl…

基于keepalived+gtid+双vip半同步主从复制的MySQL高性能集群

项目名称:基于keepalivedgtid双vip半同步主从复制的MySQL高性能集群 目录 项目名称:基于keepalivedgtid双vip半同步主从复制的MySQL高性能集群 项目规划图 1.配置4台MySQL服务器(1台master,2台slave,1台backup&a…

光伏无人机:绿色能源与航空技术的融合创新

在可再生能源和无人机技术快速发展的背景下,光伏无人机作为一种新兴的绿色航空器,正逐渐展现出其独特的优势和广阔的应用前景。本文将深入探讨光伏无人机的原理、优势以及其在多个领域的应用,展望其未来的发展趋势。 一、光伏无人机的原理 光…

基于微信小程序的外卖管理系统的设计与实现(论文+源码)_kaic

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全…

【VSCode】修改插件地址

不想放在原始C盘下面C:\Users\{用户}\.vscode\extensions为了后续存储空间考虑,想通过添加环境变量创建名为VSCODE_EXTENSIONS的环境变量,内容指向vs Code扩展所在目录即可 直接配置环境变量,不要在有空格的文件夹下面 变量名称:…

『VUE』11. 操作数组的方法(详细图文注释)

目录 vue中操作数组的方法会修改原数组的 会进行渲染更新不修改原数组的 不会进行渲染更新 push自动渲染concat 赋值渲染总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 vue中操作数组的方法 vue中数组数据呈现在网页,只检测…

Android 系统大致启动流程

Android启动流程大体为:BootRom -> BootLoader -> Kernel -> Init -> Zygote -> SystemServer ->Launcher 1、Loader层 1.1、Boot ROM 电源按下,引导芯片代码开始从预定义的地方(固化在ROM)开始执行&#xff0…

通讯录(顺序表)保存数据

在通讯录的基础上加上三个函数实现数据的保存。 分别为录入数据,加入数据与保存数据。 加入数据 先检查通讯录空间是否足够,然后将结构体ab中的数据全部放入通讯录mn中。 注意:字符串的拷贝要使用函数strcpy而不能直接用 加入完成之后将通…

速通数据结构与算法第五站 栈队列

系列文章目录 速通数据结构与算法系列 1 速通数据结构与算法第一站 复杂度 http://t.csdnimg.cn/sxEGF 2 速通数据结构与算法第二站 顺序表 http://t.csdnimg.cn/WVyDb 3 速通数据结构与算法第三站 单链表 http://t.csdnimg.cn/cDpcC 4 速通…

unity学习(82)——profiler 限制帧率

实际测试发现当玩家个数增加时,客户端明显变的很卡,想知道为什么变卡了! 1.只有玩家自己的时候 2.两个时候感觉脚本的工作量增大了 拖了一会直接炸了!(数据包积压把内存搞炸,我第一次见) 3.我觉…

Flutter 画笔(Paint)、绘制直线(drawLine)

override bool shouldRepaint(CustomPainter oldDelegate) > true; } class MyPainter extends CustomPainter { override void paint(Canvas canvas, Size size) { //画背景 var paint Paint() …isAntiAlias false …strokeWidth30.0 …color Colors.red; c…