SSL/TLS 握手过程详解

SSL握手过程详解

  • 1、SSL/TLS 历史发展
  • 2、SSL/TLS握手过程概览
    • 2.1、协商交换密码套件和参数
    • 2.2、验证一方或双方的身份
    • 2.3、创建/交换对称会话密钥
  • 3、TLS 1.2 握手过程详解
  • 4、TLS 1.3 握手过程详解
  • 5、The TLS 1.2 handshake – Diffie-Hellman Edition

1、SSL/TLS 历史发展

可以理解TLS是SSL的升级版本。

SSL 的第一个可用版本——SSL 2.0——由 Netscape 设计并于 1995 年发布。然而,SSL 2.0 中发现了漏洞,要求 Netscape 设计一个更好、更安全的版本。 一年后SSL 3.0问世。 SSL 3.0 仍然被广泛使用,直到 2014 年秋天,Google 安全团队发现了一个重大安全漏洞。

TLS 1.0 于 1999 年首次被设计为 SSL 3.0 的另一个协议升级。虽然差异并不显着,但它们足够重要,以至于 SSL 3.0 和 TLS 1.0 无法互操作。 SSL 3.0 被认为不如 TLS 安全。

TLS 1.1 创建于 2006 年,TLS 1.2 于 2008 年发布。TLS 1.2 是目前使用的版本,TLS 1.3 在2018年8月发布。 与任何其他协议升级一样,TLS 被认为比 SSL 3.0 更安全,因为每个版本都增加了阻止利用和缓解漏洞的措施。

正如您所看到的,SSL 3.0 多年来一直存在安全问题,这需要更安全的解决方案。 与任何其他技术更新一样,每个版本都存在差异,但最终用户的最终产品是相同的。 当人们提到 SSL 或 TLS 时,他们通常谈论的是同一件事,除非他们指的是协议的不同版本。

SSL 和 TLS 这两个术语可以互换使用,因为这些协议以相同的方式加密信息,并且在最基本的层面上执行相同的操作。 TLS 是 SSL 的简单升级且更安全的版本。 TLS 现已在整个网络中广泛使用,并且是交易安全的首选。 可以在服务器上同时启用所有版本的 SSL 和 TLS。

所有数字证书均与 SSL 和 TLS 协议兼容。 但是,由于 SSL 3.0 中存在显着漏洞,DigiCert 建议您在服务器上完全禁用 SSL 3.0(如果您尚未这样做)。 通过禁用 SSL 3.0 并启用 TLS,管理员将获得相同级别的加密且不会出现漏洞。 如果您不确定启用了哪些 SSL/TLS 版本,您可以使用证书检查器进行漏洞扫描、分析等。

2、SSL/TLS握手过程概览

https连接有两个方面组成:客户单和服务器端。
客户端负责发起连接,服务端接受连接。客户端和服务端即是握手的两方。
SSL/TLS 握手的目的是执行安全连接所需的所有加密工作。 这包括验证正在使用的 SSL 证书并生成加密密钥。

SSL/TLS 握手的目的是执行安全连接所需的所有加密工作

TLS 握手完成了 3 个主要任务:

  1. 协商交换密码套件和参数
  2. 验证一方或双方的身份
  3. 创建/交换对称会话密钥

2.1、协商交换密码套件和参数

每个软件都是不同的。 Web 浏览器是最常见的客户端,Google Chrome、Mozilla Firefox 和 Microsoft Internet Explorer 等流行浏览器的功能可能有所不同。 同样,在服务器端,Windows Server、Apache 和 NGINX 等流行操作系统都有非常不同的功能支持。 当您添加自定义配置时,所有这一切都变得更加复杂。 因此,TLS 握手的第一步要求客户端和服务器共享其功能,以便它们能够找到相互支持的加密功能。

一旦客户端和服务器就他们将使用的确切加密方法达成一致(称为密码套件),服务器就会向客户端发送其 SSL 证书。

2.2、验证一方或双方的身份

收到证书后,客户会检查以确保证书是“真实的”。 这是极其重要的一步。 要真正拥有安全的连接,您不能只是加密数据,您还需要知道数据被发送到正确的网站/组织。 SSL/TLS 证书提供该身份验证。 但他们的做法取决于所使用的密码套件。

所有受信任的 SSL 证书均由证书颁发机构 (CA) 颁发,该机构是已获批准颁发数字证书的公司。 这些组织必须遵循严格的颁发和验证准则,以便他们颁发的证书继续受到信任。 这主要是为了确保您只能获得您真正拥有的网站或公司的证书。 在这种情况下,您可以将 CA 视为公证人 - 它的签名表明证书上的实体就是它所说的那个实体。

在 TLS 握手的身份验证部分期间,客户端执行多项加密安全检查,以确保服务器提供的证书是真实的。 这包括检查数字签名并确保证书来自受信任的 CA。

在此阶段,客户端还会验证服务器是否拥有与证书关联的私钥。 所有 SSL 证书都包含由公钥和私钥组成的密钥对。 公钥用于加密数据,私钥用于解密。 这被称为“非对称”公钥加密,因为这两个功能是由不同的密钥执行的。 加密实际上是单向的。

使用最常见的公钥密码系统 RSA,客户端将使用需要用于生成会话密钥的公钥来加密随机数据。 服务器只有拥有提供所有权证明的私钥才能解密和使用该数据。

如果使用另一种类型的密码系统(例如 ECC),则此过程会发生变化,但始终会检查所有权证明。

2.3、创建/交换对称会话密钥

TLS 握手的最后一部分涉及创建“会话密钥”,这是实际用于安全通信的密钥。

会话密钥是“对称的”,这意味着相同的密钥用于加密和解密。 这些密钥可以比非对称密钥更有效地实现强加密,从而适合在 HTTPS 连接中来回发送数据。

生成密钥的确切方法根据所选的密码套件而有所不同,其中两种最常见的方案是 RSA 和 Diffie-Hellman。

为了结束握手,各方让对方知道他们已经完成了所有必要的工作,然后双方都运行校验和以确保握手发生时没有任何恶意篡改或损坏。

整个 SSL 握手发生在几百毫秒内,并且全部在幕后进行。 这是 HTTPS 连接中必须发生的第一件事,甚至在网页加载之前。

SSL 握手完成后,加密且经过身份验证的 HTTPS 连接就会开始,您和服务器之间发送和接收的所有数据都会受到保护。

在 TLS 1.3 之前,每次重新访问站点时,握手都会再次发生。 TLS 1.3握手支持0 RTT,即零往返时间恢复,大大提高了回访者的速度。 此前,许多服务器为了效率和速度而实施了“恢复”过程,但 0 RTT 将其提高到 11。

3、TLS 1.2 握手过程详解

TLS 1.2 在 2008年发布,TLS 1.2 是目前使用广泛的版本。

每次 TLS 握手都涉及一系列步骤,这些步骤完成我们上面总结的三个主要任务:交换加密功能、验证 SSL 证书以及交换/生成会话密钥。

对于那些希望了解确切过程的人,以下是 TLS 1.2 握手涉及的步骤(使用 RSA - 我们在本文后面有一个 Diffie-Hellman TLS 1.2 握手的示例)。

这些步骤如下图所示,左侧是客户端,右侧是服务器。

在这里插入图片描述

1、第一条消息称为“ClientHello”。 此消息列出了客户端的功能,以便服务器可以选择两者用于通信的密码套件。 它还包括一个随机挑选的大素数,称为“客户端随机数”

2、服务器礼貌地回复“SeverHello”消息。 在此消息中,它告诉客户端它从提供的列表中选择了哪些连接参数,并返回自己随机选择的质数(称为“服务器随机数”)。 如果客户端和服务器不共享任何共同功能,则连接将无法成功终止。

3、在“Certificate”消息中,服务器将其 SSL 证书链(包括其叶证书和中间证书)发送给客户端。 为了向连接提供身份验证,SSL 证书由 CA 签名,这允许客户端验证证书是否合法。 收到证书后,客户端会执行多项检查来验证证书。 这包括检查证书的数字签名、验证证书链以及检查证书数据是否存在任何其他潜在问题(证书过期、域名错误等)。 客户端还将确保服务器拥有证书的私钥。 这是在密钥交换/生成过程中完成的。

4、这是一条可选消息,仅对于需要服务器提供附加数据的某些密钥交换方法 (Diffie-Hellman) 才需要。

5、“Server Hello Done”消息告诉客户端它已经发送了所有消息。

6、然后,客户端提供其对会话密钥的贡献。 此步骤的细节取决于在初始“Hello”消息中决定的密钥交换方法。 在此示例中,我们将研究 RSA,因此客户端将生成称为预主密钥的随机字节字符串,然后使用服务器的公钥对其进行加密并传输。

7、“Change Cipher Spec”消息让对方知道它已经生成了会话密钥并将切换到加密通信。

8、然后发送“Finished”消息以表明客户端的握手已完成。 Finished 消息已加密,并且是受会话密钥保护的第一个数据。 该消息包含允许各方确保握手未被篡改的数据 (MAC)。
9、现在轮到服务器做同样的事情了。 它解密预主密钥并计算会话密钥。 然后,它发送“更改密码规范”消息以指示它正在切换到加密通信。

10、服务器使用刚刚生成的对称会话密钥发送“完成”消息,它还执行相同的校验和来验证握手的完整性。

经过以上这些步骤后,SSL 握手就完成了。 双方现在都拥有会话密钥,并将开始通过加密且经过身份验证的连接进行通信(数据传输)。

此时,可以发送“应用程序”数据的第一个字节(属于双方将通信的实际服务的数据,即网站的 HTML、Javascript 等)。

通过实际抓包看TLS 1.2 的握手过程
在这里插入图片描述

4、TLS 1.3 握手过程详解

让我们首先看一下正在运行的 TLS 1.3 握手,然后我们将深入研究已做出的改进。 如您所见,TLS 1.3 握手时间明显短于其前身。

在这里插入图片描述

1、与 TLS 1.2 握手一样,客户端 Hello 消息会启动握手,但这次它包含了更多信息。 TLS 1.3 将支持的密码数量从 37 个减少到 5 个。我们稍后会详细了解这意味着什么,但在握手的上下文中,这意味着客户端可以猜测将使用什么密钥协商/交换协议 除了从它猜测的任何协议发送其密钥共享之外。

2、服务器将用自己的 Server Hello 消息进行响应,同样,服务器非常有礼貌。 与 1.2 握手一样,此时它也会发送证书。 并且,如果客户端猜对了并且两者已就相同的 AEAD 协议达成一致,则服务器会发送自己的密钥共享部分,计算会话密钥并以服务器完成消息结束。

3、现在已经拥有所有相关信息,客户端将验证 SSL 证书并使用两个密钥共享来计算自己的会话密钥副本。 完成后,它会发送自己的 Finished 消息。

5、The TLS 1.2 handshake – Diffie-Hellman Edition

之前我们介绍了 TLS 1.2 握手的 RSA 版本。 但现在我们已经了解了 DH 与 RSA 的不同之处,让我们看看基于 DH 的 TLS 1.2 握手是什么样子的。

同样,这两种方法之间有很多相似之处,但不是用一种算法来处理身份验证和密钥交换,而是对任务进行了划分。 相反,我们将使用 ECDHE 进行密钥交换,使用 ECDSA 进行身份验证。

在这里插入图片描述

1、与 RSA 一样,客户端以“ClientHello”消息开始,其中包含密码套件列表以及客户端随机数。

2、服务器用自己的“ServerHello”消息进行响应,其中包括其选择的密码套件和服务器随机数。

3、服务器发送其 SSL 证书,就像 RSA TLS 握手一样,客户端将运行一系列检查来验证证书是否有效,但由于 DH 本身无法验证服务器,因此需要额外的机制。

4、为了提供身份验证,服务器获取客户端和服务器的随机数以及将用于计算会话密钥的 DH 参数,并使用其私钥对其进行加密。 这起到了数字签名的作用,客户端将使用公钥来验证签名——并且服务器是密钥对的合法所有者——并用自己的 DH 参数进行响应。

5、服务器以“Server Hello Done”消息结束此往返。

6、与 RSA 不同,客户端无需使用非对称加密将预主密钥发送到服务器,而是客户端和服务器使用之前交换的 DH 参数来获得预主密钥。 然后双方使用刚刚计算出的预主密钥来相互得出会话密钥。

7、客户端发送“Change Cipher Spec”消息,通知对方切换到加密。

8、客户端发送最终的“完成”消息,表明它已经完成了握手的部分。

9、同样,服务器发送“更改密码规范”消息。

10、握手以服务器“完成”消息结束。

参考链接: https://www.thesslstore.com/blog/explaining-ssl-handshake/#comments

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自然语言转SQL,一个微调ChatGPT3.5的实例(下)--模型微调及模型性能

提交训练集进行微调 一旦我们创建了JSONL文件(可以在这里或ipfs_here找到一个小样本),下一步是使用以下命令将创建的文件上传到OpenAI: openai.api_key os.getenv("OPENAI_API_KEY") print(openai.File.create(fileo…

【水浸传感器】软硬件一体水浸监测整套方案远程监测解决各种环境漏水问题

一、痛点分析 在工业生产中,水浸传感器可以安装在数据中心、半导体厂房、输油管道、车间仓库、变电室等易发生水浸的区域。一旦检测到漏水情况,立即发出信号反馈。然而,水浸传感器分散在各个地点,导致管理不集中、不便捷&#xf…

Fiber Golang 中的路由和中间件

掌握 GoLang Fiber 中的路由和中间件艺术,以进行高效的 Web 开发 在网络开发领域中,创建一个有效地路由和管理各种任务的 Web 应用程序至关重要。路由决定了如何处理传入的请求,而中间件在执行任务,如身份验证、日志记录和请求解…

力扣刷题-二叉树-最大二叉树

654.最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构建最大…

Dockerfile语法和简单镜像构建

Dockerfile是一个用于定义Docker镜像的文本文件,包含了一系列的指令和参数,用于指示Docker在构建镜像时应该执行哪些操作,例如基于哪个基础镜像、复制哪些文件到镜像中、运行哪些命令等。 Dockerfile文件的内容主要有几个部分组成&#xff0c…

Unity3D入门基础知识汇总

1、参考链接 01.游戏引擎是啥玩意?_哔哩哔哩_bilibili 2、unity概念 它是一套具有完善体系与编辑器的跨平台游戏开发工具,也称之为游戏引擎。游戏引擎是指一些编写好的可重复利用的代码与开发游戏所用的各功能编辑器。 3、unity界面 右上边可以切换布局…

Python 快速合并PDF表格转换输出CSV文件

单位的刷脸考勤机后台系统做得比较差,只能导出每个部门的出勤统计表pdf,格式如下: 近期领导要看所有部门的考勤数据,于是动手快速写了个合并pdf并输出csv文件的脚本。 安装模块 pypdf2,pdfplumber,前者用…

python包chromadb安装失败总结

1,背景: 最近在学习langchain的课程,里面创建自己的知识库的Retrieval模块中,需要用到向量数据库。 所以按照官方的教程(vectorstores),准备使用chroma的向量数据库。图片来源 2,问…

有没有可以多渠道报修的维修管理系统?

以前我们买电视、空调这些电器,如果出了故障,一般都是打电话给门店,然后门店就会派人来修理。有的人则会自己找维修工人来维修,一般也是通过电话报修。不过现在是互联网时代,电话报修效率低下、信息传递不畅、实时跟踪…

mysql死锁排查

查看正在进行中的事务 SELECT * FROM information_schema.INNODB_TRX;字段解释trx_id唯一事务id号,只读事务和非锁事务是不会创建id的trx_state事务的执行状态,值一般分为:RUNNING, LOCK WAIT, ROLLING BACK, and COMMITTING.trx_started事务…

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成 --合并生成后的代码【鱼皮】

一、模块页面功能 1.1 domain 【实体对象】 1.2 mapper 【操作数据库的对象】--> UserMapper 1)UserMapper 其实就是我们用来操作数据库的一个对象 2) 继承了mybatis- plus,它会自动帮我们去定义一些增删改查的方法。 继承可以看下图&#xf…

ROS 系列学习教程(总目录)

ROSLearning 一、ROS概览 1.1 ROS简介 To be continued… 1.2 ROS安装 Ubuntu 安装 ROS 详细教程(以最后一个ROS1版本Noetic为例) 1.3 ROS Hello World ROS创建工作空间添加包并编译 ROS Hello World 1.4 ROS架构 ROS架构:文件系统 …

[数据库] MySQL之MHA高可用

一、MHA相关知识 1.1 什么是mha MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障…

深入理解CRON表达式:时间调度的艺术

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

《作家天地》期刊投稿邮箱投稿方式

《作家天地》是国家新闻出版总署批准的正规文学刊物。对各种流派的作品兼收并蓄,力求题材、形式、风格多样化,适用于发表高品质文学学术作品,科研机构的专家学者以及高等院校的师生等。具有原创性的学术理论、工作实践、科研成果和科研课题及…

javascript 常见工具函数(二)

11.数组等分切片&#xff1a; this.newMapList []; for (var i 0; i < this.mapDataList.length; i 2) {this.newMapList.push(this.mapDataList.slice(i, i 2)); } 12.js做奇偶判断&#xff1a; if (this.mapDataList.length ! 0) {this.mapDataList.length % 2 0 ?…

从0到1入门C++编程——03 内存分区、引用、函数高级应用

文章目录 一、内存分区二、引用三、函数的高级应用1.默认参数2.占位参数3.函数重载 一、内存分区 C程序在执行时&#xff0c;会将内存大致分为4个区&#xff0c;分别是代码区、全局区、栈区和堆区。 代码区用来存放函数体和二进制代码&#xff0c;由操作系统进行管理。 全局区…

js统一公共请求处理与常用工具封装

一个完整的前端项目往往会进行一些必要的抽取公用代码进行封装&#xff0c;这里记录js常用工具及统一的公共请求的封装。 一 2017年 第一版web管理后台在用 web后台管理页面用 /*** Created by hua on 2017/8/24.*/ var requestResult{success :0,failure:1,failureMsg:2 }j…

Ubuntu上使用node搭建本地静态http服务器

1.搭建步骤 1.安装Node.js。首先确保你的Ubuntu系统已经安装了Node.js。如果没有安装&#xff0c;可以通过以下命令进行安装&#xff1a; sudo apt-get update sudo apt-get install nodejs #安装nodejs 2.安装npm。npm是Node.js的包管理器&#xff0c;一般会随着Node.js一…

Minio部署在服务器上,分享图片等文件提示,签名不对

问题描述: 上传没问题 下载没问题 就是分享有问题,签名有问题 找了很多解释,什么nginx代理问题啊,什么端口问题啊 什么防火墙问题啊 都是扯淡,一点用没有 最后发现,我的分享链接是127.0.0.1的地址,并不是我的服务器本机的地址 我访问图片都是要把ip改了再去访问,但是一开始并没…