HTTPS之TLS1.2连接详解

2023-10-27

本文说一下HTTPS的会话连接详情,HTTPS连接除了正常的TCP三次连接,还引入了TLS连接。

本文说的是基于

在这里插入图片描述

1、三次握手连接

首先通过三次握手连接来建立连接

接下来就是TLS连接

2、TLS第一次握手 ——ClientHello

客户端首先明文发送以下信息,用于建立加密连接
1、随机数ClientRandom
客户端生成一个随机数ClientRandom ,用于后面合成 密钥

2、TLS版本号
客户端支持的TLS版本号

3、加密套件列表
客户端支持的加密算法列表
在这里插入图片描述

套件包括以下信息:
摘要算法: 签名中的压缩算法
密钥生成算法: 用于生成密钥
对称加密算法: 后续传输数据用什么算法进行对称加密
非对称加密算法: 传输密钥的时候用什么非对称加密算法

在这里插入图片描述

3、TLS第二次握手

服务器收到客户端发送的ClientHello,然后发送回应信息到客户端,分为以下三个包

1、ServerHello

ServerHello中包括以下信息
1、确认TLS版本号
确认客户端发送的TLS版本号,如果不支持客户端对应的TLS版本,就中断连接。

2、随机数ServerRandom
服务器也随机生成一个随机数ServerRandom,用于后面合成密钥

3、加密套件
服务器从客户端中发来的加密算法列表中选择一个套件作为加密套件

在这里插入图片描述

2、Certifacte

返回服务器的CA证书,客户端从CA证书中获取公钥
在这里插入图片描述

3、Server Key Exchange

TLS中的密钥生成非常复杂,不是简单的由客户端生成一个随机数,而是利用ECDHE 算法生成一个对称密钥,然后在和客户端生成的一个随机数、服务器生成的一个随机数合成一个更随机的密钥。

ECDHE算法可以根据两组公钥和私钥来生成一个对称密钥,假设由两组公钥和私钥,公钥1和私钥1是配对的,公钥2和私钥2是配对的。

密钥的生成流程如下:
1、制定参数,两组公钥和私钥共用一组参数
2、一个随机数作为私钥,每组都随机生成一个数作为私钥
3、根据私钥+参数 生成一个公钥,比如利用私钥1生成公钥1.
4、利用私钥1和公钥2经过运算得到一把密钥,利用私钥2和公钥1经过运算得到一把密钥,这两把密钥是一模一样的。

没错,两组公钥和私钥就分别对应着客户端和服务器。

服务器制定好参数,然后随机生成一个私钥1,然后利用规则生成一个公钥1。

服务器将 公钥1和参数包装为Server Param发送给客户端,这个过程叫做Server Key Change

Server Param会通过数字签名技术来保证黑客无法篡改服务器发送的公钥1。通过服务器之前的私钥(不是私钥1,而是CA证书对应的私钥)进行加密,由于之前客户端已经从CA证书中获取了对应的公钥,客户端是可以顺利解析出公钥1的。

通过参数和公钥是无法破解出私钥的,私钥就存放在本地,不会在网络中传输

ServerHelloDone
服务器发送ServerHelloDone,说明服务器已经将TLS需要的所有信息都发送给客户端了。

TLS第三次握手

客户端会从CA证书中获取到服务器对应的公钥,如果获取公钥失败,就说明CA证书被篡改了,就会终止连接。

接着生成一个随机数作为私钥2,利用私钥2和Server发过来的公钥1生成一个随机数 pre-master,同时利用ClientRandom、ServerRandom、pre-master这三个数生成了密钥。这就是之后 客户端和服务器之间进行对称加密的密钥。

ClientKeyExchange
利用服务器发过来的参数和私钥2,生成一个公钥2。然后将公钥2发送给服务器,这样叫做Client Key Exchange

客户端接着会发送一个Change Cipher Spec,表示客户端开始使用密文进行传输了。
在这里插入图片描述

然后发送一个Finished,里面记载着客户端在TLS握手期间向服务器发送的所有数据做一个摘要,服务器收到后,也会将服务器之前收到的数据也做一个摘要,比对是否一致,如果一致,说明TLS连接正常,没有被黑客篡改。
在这里插入图片描述

在TLS第三次握手后,客户端就可以开始发送密文数据了。

TLS四次握手

服务器在收到公钥2后,也会通过参数和私钥1生成一个密钥pre-master,然后根据ClientRandom、ServerRandom、pre-master这三个数生成最终的密钥。

然后也发送一个Change Cipher Spec,表示服务器也开始使用密文进行传输。

最后发送一个Finished,里面记载着服务器向客户端发送过的数据的摘要,客户端收到后,也会把之前接收服务器的数据做一个摘要,比对两者,如果一致,就说明连接安全,如果不一致,就说明数据被黑客篡改了。

为什么这么费劲的使用ECDHE算法来生成密钥呢?

1、如果由客户端随机生成一个密钥,是容易被黑客猜测到的,所以引入了ECDHE,来进一步增强随机性。
2、ECDHE比RSA具有前向安全。如果采用RSA的话,一旦服务器密钥泄露,黑客收集了之前的密钥传输数据,就能解密之前的连接对应密钥。如果该连接还在运行,数据就会泄露。并且之后的连接也会被泄露。

ECDHE不会通过服务器私钥生成对称密钥,而是每次连接都随机生成一个私钥来生成对称密钥,安全性高的狠。

RSA 和 ECDHE的区别

在这里插入图片描述

1、RSA的做法是客户端直接生成随机数,然后通过公钥传输给服务器就行了。少了ECDHE的密钥、ServerRandom、Client的等数据的传输过程。

2、ECDHE客户端在第三次握手就可以发送数据了,而RSA客户端需要四次握手后才能发送数据

3、ECDHE 比 RSA更安全。

如果服务器的私钥被泄露,那么RSA中的密钥传输到服务器的时候,黑客是可以将其解密出来的。

而ECDHE即使服务器的私钥泄露,也不会造成密钥泄露,因为密钥是由ECDHE的私钥控制生成的,并且ECDHE的私钥是随机生成的,实在太tm安全了

Finished校验的必要性

Finished校验是非常有必要的,如果不校验的话,不论是RSA传输pre-master的时候,还是ECDHE传输ClientRandom、ServerRandom、以及客户端的公钥2的时候,都有可能被篡改。

导致客户端和服务器对应的密钥不一致,虽然不会泄露数据,但是数据是不能正常解密的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTPS之TLS1.2连接详解 的相关文章

  • https 客户端使用客户端证书和密码通过 cpp-netlib 获取

    我正在尝试使用 cppnetlib 甚至 boost asio 库来连接以执行简单的 url 获取并将结果页面拉下来 我已经让它可以与http一起使用 甚至可以使用https使用cppnetlib 但我需要提供一个需要密码的客户端证书 不幸
  • 使用 QNetworkAccessManager 支持 https。运行时遇到 SslErrors

    我正在使用 QNetworkAccessManager 执行 https get 操作 我在运行时遇到 SSLErrors 经过一段时间的研究 我能够在安装 OpenSSL 后运行我的程序 我需要两个 dll libeay32 dll 和
  • 读取错误:SSL 库失败,通常是协议错误

    我正在尝试使用 DefaultHttpClient 访问安全 url 我正在使用 portecel 工具创建 BKS 文件 使用相同的方法创建的 jks 文件在 java 程序中工作正常 但 bks 抛出以下异常 java io IOExc
  • 如何使 Google App Engine 上的 Rails 应用程序重定向到 HTTPS

    我已成功将 Rails 应用程序部署到 Google App Engine 我的域也由 Google 托管 现在我想将访问我的 http 地址的任何人重定向到我的 https 地址 我找到了针对 Python 应用程序执行此操作的文档her
  • 将自签名 https 证书添加到 teamcity 后,TeamCity 构建代理会断开连接

    我向 Teamcity BuildServer 添加了一个自签名证书以引入 https 支持 以便现在可以通过以下地址访问它 https ServerUrl 8443 有关如何进行的更多详细信息here http tomcat apache
  • 为什么我的网站 URL 末尾有双斜杠,如下所示://

    当我输入我的网站 zeugmarket com 时 它显示为https zeugmarket com https zeugmarket com 我编写了这个 htaccess 文件以从 HTTP 转移到 https 但它还在末尾添加了两个斜
  • 为什么https只能用于登录?

    性能是唯一的问题吗 不能在整个用户会话期间使用 https 连接吗 显然重定向发生的情况较少 我发现这个相关问题http 与 https 性能对比 https stackoverflow com questions 149274 http
  • 客户端身份验证方案“匿名”禁止 HTTP 请求

    这似乎是一个常见问题 我已经查看了这里的所有答案 但没有一个有帮助 我正在尝试让 SSL 与 iis 上托管的 basichttpbinding 和 WCF 服务一起使用 我认为问题出在 iis 或证书上 我已经在 iis 管理器中创建了一
  • 对于“未找到项目”错误页面,最合适的 HTTP 状态代码是什么

    我很好奇 项目不存在 页面最合适的 HTTP 状态代码是什么 如果页面本身不存在 我显然会使用 404 但是 我的其中一个页面有一个userid参数 它是一个 编辑用户 页面 如果不存在具有给定用户 ID 的用户 我将显示一个错误页面 但我
  • 对在欧盟地区运行的 Heroku 应用程序强制使用 SSL

    我正在努力为 Heroku 欧盟地区 上运行的 Rails 应用程序强制实施 SSL 连接 我已成功将证书 包括 Heroku SSL 附加组件 添加到自定义域 如果我明确声明 https com 则效果完美 但我想将所有 http 请求重
  • 带有 pfx 文件的 Azure https

    我正在尝试创建一个https我的天蓝色服务的端点 我被给予了p7b我转换成的文件cer文件 来自cer我能够用几行 c 转换为pfx var cert new X509Certificate2 certpath var bytes cert
  • Java HTTPS客户端证书认证

    我对HTTPS SSL TLS我对客户在使用证书进行身份验证时到底应该提供什么内容感到有点困惑 我正在编写一个 Java 客户端 需要执行一个简单的操作POST数据到特定的URL 这部分工作正常 唯一的问题是它应该重新完成HTTPS The
  • 如何从一个端口为 Jetty 提供 https 和 http 服务?

    我知道这是一个重复的问题 但原始发帖者提出这个问题的原因是错误的 我并不是暗示我问它是为了right原因 但让我们看看 我们有一个在非标准端口号上运行的 Web 服务 尽管用户似乎能够记住端口号 但有时他们会错误地输入 http 而不是 h
  • 如何在 Cocoa Touch 中验证网站证书?

    我目前使用 NSURLConnection 打开到 Web 服务器的 https 连接 一切正常 我能够检索我想要的页面内容 该证书是由 VeriSign 颁发的 我假设 NSURLConnection 做了一些工作来在某种程度上验证证书的
  • 对登录 Instagram 的 PhantomJS 代码进行故障排除

    我编写了这个 PhantomJS 脚本来自动登录 Instagram 它可以成功填写表单字段并按提交按钮 但它总是被重定向回登录屏幕并显示以下消息 你的用户名或密码不正确 我 100 确信凭据是正确的 并且我用多个 Instagram 帐户
  • 是否可以为 IP 地址而不是域名提供 SSL 证书? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望我的网站使用类似的 URLhttp 192 0 2 2 and https 192 0 2 2 用于静态内容 以避免请求中不必要的
  • 无法通过 HTTPS 调用 Web 服务

    我正在开发一个 Net 应用程序 它与 Web 服务通信以获取一些数据 Net 应用程序和 Web 服务之间的连接是通过 HTTPS 完成的 当我从 Net 应用程序调用 Web 服务时 我得到以下堆栈跟踪 System Net WebEx
  • 无对等证书例外 - Volley 和具有自签名证书的 Android

    我正在尝试让我的应用程序通过 https 与我的服务器通信 由于我不想付费让受信任的 CA 签署我的服务器证书 解决方案是使用自签名证书 因此 我创建了 caconfig cnf 如下所示 ca default ca CA default
  • 使用 https 的 Java Jersey RESTful Web 服务

    我是 Java EE 的新手 正在开发一个 RESTful API 其中每个 API 调用用户都会发送编码的凭据 我的问题是如何通过默认的 http 实现 https 协议并确保我的连接安全 我正在使用 Jersey Restful Web
  • 如何最好地将 Facebook 评论从 http 移至 https

    我们正在将 Ruby On Rails 网站从 HTTP 迁移到 HTTPS 我们的网站使用fb comments用于捕获各个页面上的用户评论的插件 在我们的测试过程中 我们发现当我们将页面从 HTTP 切换到 HTTPS 时 Facebo

随机推荐

  • 人工智能发展情况调研

    人工智能发展情况调研Artificial intelligence development circumstance investigation北京师范大学继续教育学院 2000级计算机科学与技术 赵旭峰E mail zxf95 163 c
  • Excel中如何找出两列数据中相同的数据,并且进行同行显示

    使用VLOOKUP方法即可 VLOOKUP A2 Sheet1 B C 1 0 的含义是 在sheet1工作表的B C区域的首列中查找等于a2的值 找到后 返回该区域的同行的值 最后的参数0表示精确查找 比如 想要列2根据列1中的数据进行排
  • PG概述及OSD对PG状态的影响

    前言 随着分布式存储的广泛应用 目前对PG的关注越来越多 本文基于ONStor分布式存储系统简要介绍一下PG的状态变化 重点说明OSD对PG状态的影响 一 Ceph分布式存储概述 Ceph是一个统一的分布式存储系统 设计初衷是提供较好的性能
  • Gazebo中特异性里程计odom的发布

    需求 将里程计 odom改成以小车初始位置为原点 车体坐标轴为方向建立坐标系 用该坐标系下的位姿作为里程计数据的位姿 分析 odom是ros发布的相对固定的里程计信息 不能使用命令行工具直接修改里程计信息参考的初始位置 因此 从 odom坐
  • QT5 创建“打开文件”按钮

    在GUI界面设计中 有时需要 打开文件 按钮 以加载外部文件 则需要我们用QFileDialog的静态函数完成 QT5中几个文件相关函数如下 函数名 作用 getOpenFileName 加载用户选择文件的文件名 getSaveFileNa
  • Java函数、数组

    Java函数 数组 函数 函数 就是定义在类中的具有特定功能的一段独立小程序 格式 修饰符 返回值类型 函数名 参数类型 参数1 参数类型 参数2 执行语句 return 返回值 返回值类型 函数运行后的结果的数据类型 参数类型 是形式参数
  • 手撸代码-删除链表的倒数第n个节点

    描述 给定一个链表 删除链表的倒数第 nn 个节点并返回链表的头指针 例如 给出的链表为 1 2 3 4 5 n 2n 2 删除了链表的倒数第 n 个节点之后 链表变为1 2 3 5 备注 题目保证 nn 一定是有效的 请给出时间复杂度为
  • Centos下配置Harbor私有仓库

    Centos下配置Harbor私有仓库 Harbor是一个开源的企业级容器镜像仓库 可以帮助用户建立和管理自己的私有Docker镜像仓库 本文将介绍在Centos操作系统下如何配置和使用Harbor私有仓库 安装Docker 首先 我们需要
  • 服务器安装完系统老重启,服务器老是自动重启

    服务器老是自动重启 内容精选 换一换 该任务以 Windows Server 2008 R2 64位 操作系统为例 指导用户安装Windows操作系统 由于镜像文件不同 安装步骤稍有不同 请根据实际的安装界面提示进行操作 请根据实际情况完成
  • linux文件系统初始化过程(3)---加载initrd(上)

    一 目的 本文主要讲述linux3 10文件系统初始化过程的第二阶段 加载initrd initrd是一个临时文件系统 由bootload负责加载到内存中 里面包含了基本的可执行程序和驱动程序 在linux初始化的初级阶段 它提供了一个基本
  • 如何在Linux中设置静态IP和配置网络

    如何在Linux中设置静态IP和配置网络 文章目录 如何在Linux中设置静态IP和配置网络 1 使用ifconfig的一次性修改 1 修改静态ip 2 修改网关 2 修改配置文件的永久性修改 1 Ubuntu相关系统 2 CentOS相关
  • C#+Sql Server开发一个简易的学生管理系统

    效果图 目前是这样 如果想做成这样 加一个DataGridView进行显示即可 使用VS2017新建一个控制台应用程序 连接数据库 即可对数据库进行增删改查 更多的功能还没有写 不适合直接拿去做课设 不过基本架子都有了 更多复杂的功能写sq
  • Qt之回调函数:6 在QT中使用回调函数替代信号槽

    文章目录 一 前言 二 如何使用CALLBACK工作 程序及解释 小方块 主窗口 MainWindow ui 总结 在QT中使用回调函数替代信号槽 前面讲了一堆 就是为了实现看到的这篇文章中的例子 由于对回调不懂 前前后后翻阅参考了一大堆优
  • 阻止a标签默认行为的几种简单方法

    1 a href Click Me a onclick方法负责执行js函数 而void是一个操作符 void 0 返回undefined 地址不发生跳转 a href Click Me a 和void 0 一样 都返回 undefined
  • 07_scrapy的应用——获取电影数据(通过excel保存静态页面scrapy爬虫数据的模板/通过数据库保存)

    0 前言 一般我们自己创建的一些python项目 我们都需要创建虚拟环境 其中会下载很多包 也叫做依赖 但是我们在给他人分享我们的项目时 不能把虚拟环境打包发送给别人 因为每个人电脑系统不同 我们可以把依赖导出为依赖清单 然后别人有了我们的
  • ext显示服务器文件系统,centos – 如何找出ext3文件系统损坏的原因?

    我们有一个运行CentOS 5 8虚拟机的VMware vSphere 5环境 在过去两周内 我们遇到了五个虚拟机事件 这些虚拟机的文件系统已损坏 需要修复fsck 以下是我们在日志中看到的内容 Nov 14 14 39 28 hostna
  • Ubuntu卸载软件:3种卸载方式

    1 使用Synaptic软件包管理器进行卸载 打开软件包管理器 Ubuntu自带了一个GUI Graphical User Interface 图形化用户界面 软件包管理器 它可 以让你在一个可视化窗口中卸载程序 如果你不习惯使用命令行 这
  • spring报错 XXX will not be managed by Spring

    如上提醒表示当前不是Spring管理着呢 是你的数据库插件Mybatis或者MybatisPlus给你管理呢 所以Spring给你温馨提醒了一下而已 又没有报错 解决的办法是在数据查找的方法上添加 Transactional 然后就会变成s
  • error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义 找到一个或多个多重定义的符号

    今天在搞一个动态链接库的时候 出现了这样的错误 1 gt mfcs100ud lib dllmodul obj error LNK2005 DllMain 12 已经在 MSVCRTD lib dllmain obj 中定义 1 gt E
  • HTTPS之TLS1.2连接详解

    本文说一下HTTPS的会话连接详情 HTTPS连接除了正常的TCP三次连接 还引入了TLS连接 本文说的是基于 1 三次握手连接 首先通过三次握手连接来建立连接 接下来就是TLS连接 2 TLS第一次握手 ClientHello 客户端首先