【开发经验】结合实际问题解决详述HTTPS通信过程

最近的开发调试过程中涉及到了HTTPS发送与接收,遇到实际问题才发现对这部分尚属于一知半解。结合实际问题的解决过程来详细整理以下HTTPS通信过程。

需要调试的功能为BMC作为客户端向搭建好的Web服务器发送HTTPS请求,Web服务器负责接收处理发送过来的HTTPS请求。BMC的IP为100.6.100.224,Web服务器的IP为100.2.74.71。在BMC向Web服务器发送一条请求HTTPS请求,服务器成功接收到请求,返回成功信息。通过WireShark抓包这一过程,如下图所示:

OpenBMC发送HTTPS请求过程
从中可以看出,HTTPS通信过程分为两部分,首先进行TCP握手,然后进行TLS握手并发送信息。

1.1 TCP三次握手

前三个Wireshark数据包展示的就是TCP三次握手的过程,如下图所示:

TCP三次握手过程

1.1.1 第一次握手

第一次握手,客户端向服务器端发送SYN标志置位的报文,同时生成自己的随机初始序列号seq。数据包如下图所示。(这里客户端使用的seq直接使用了0,不太清楚为什么不是随机数)

第一次握手

1.1.2 第二次握手

第二次握手,服务器端向客户端发送SYN与ACK置位的报文,生成服务器端的随机初始序列号seq(这里服务器端的seq也直接使用了0),可以看到回复的报文中Ack的值为1(客户端seq+1),表示已收到客户端的SYN。

第二次握手

1.1.3 第三次握手

第三次握手,客户端向服务器端发送ACK置位的报文,报文中Ack的值为1(服务器端seq+1),服务器端收到后TCP连接就成功建立了。

第三次握手

1.2 TLS握手

TCP连接建立后,开始进入TLS握手阶段。TLS握手阶段数据包如下所示:

TLS握手过程

1.2.1 Client Hello

首先客户端向服务器端发送初始消息,内容包括支持的 TLS 版本,客户端随机数(Client Random,用于后续密钥生成)与支持的加密套件列表等,如下图所示。

Client Hello

1.2.2 Server Hello

服务器端会回复这一消息,如下图所示,回复的消息中包括选定的 TLS 版本(与客户端支持的版本一致),服务器随机数(Server Random,用于后续密钥生成)与选择的加密套件(从客户端发送的列表中选择),从图中可以看出服务器端选择了TLS v1.2,加密套件为TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

Server Hello

1.2.3 Certificate,Serverkey Exchange,Server Hello Done

下图的数据包中包括了Certificat,Serverkey Exchange与Server Hello Done三部分信息。服务器端发送其数字证书,包含服务器的公钥、证书颁发机构(CA)的签名以及域名等信息,供客户端验证身份,客户端则会验证证书是否由可信 CA 颁发、证书是否过期或被吊销以及证书中的域名与实际访问的域名是否一致。如下图所示,可以看到数据包中包含了证书信息

Certificate

视选择的加密套件需要,服务器还会发送密钥交换参数(如 ECDHE 的公钥参数)以及用服务器私钥签名的数据(确保参数未被篡改):

ServerKey Exchange
最后服务器端还通知客户端,协商部分结束:
Server Hello Done

1.2.4 Client Key Exchange,Change Cipher Spec,Encrypted HandShake Message

客户端会生成一个预主密钥(pre-master secret),预主密钥用服务器的公钥加密后会被发送给服务器端。服务器会使用其私钥解密这个预主密钥,从而获得客户端的预主密钥。双方都拥有预主密钥之后,会使用之前的两个随机数(Client Hello中的Random与Server Hello中的Random)生成主密钥。到这里还没结束,TLS协议会使用PRF(伪随机函数)来从主密钥派生出一个用于加密的会话密钥和一个用于消息完整性和认证的MAC密钥。所有的密钥被正确生成和派生之后,客户端和服务器会通过交换完成的消息来确认彼此的身份,并确保所有的握手参数都是一致的,到此握手阶段才算完成。

客户端Client Key Exchange,Change Cipher Spec,Encrypted Handshake Message

服务器端 Change Cipher Spec,Encrypted Handshake Message

1.2.5 Application Data, FIN

完成握手后,客户端就开始向服务器端发送数据。从数据包中可以看到,正常发送完毕之后,服务器端发送FIN标志置位的数据包断开连接,连接最后被断开了。

发送数据并断开连接

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

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

相关文章

【Android】Android Activity 横屏设置详解及常见异常问题解决方法汇总

在 Android 开发中,我们经常需要控制 Activity 的屏幕方向,例如视频播放、游戏、VR/AR 应用等场景通常希望默认横屏显示。本文将讲解如何通过 Manifest 配置 和 Java/Kotlin 代码 设置横屏显示,并分析常见设置无效的原因与解决方法。 一、通过…

文件相关:echo重定向管道命令扩展详解

一、echo 文字内容 echo 会在终端中显示参数指定的文字,通常会和 重定向 联合使用 二、重定向 > 和 >> Linux 允许将命令执行结果 重定向到一个 文件将本应显示在终端上的内容 输出 / 追加 到指定文件中 其中: >表示输出,会覆…

Python 中使用单例模式

有这么一种场景,Web服务中有一个全局资源池,在需要使用的地方就自然而言引用该全局资源池即可,此时可以将该资源池以单例模式实现。随后,需要为某一特殊业务场景专门准备一个全局资源池,于是额外复制一份代码新建了一个…

websocket深入-webflux+websocket

文章目录 背景版本约定配置文件代码使用webflux使用websocket配置文件handler基类实现类注册路由 背景 基于更复杂的情况和更高的开发要求,我们可能会遇到必须同时要使用webflux和websocket的情况。 版本约定 JDK21Springboot 3.2.0Fastjson2lombok 配置文件 &…

致远OA —— 表单数据获取(前端)

文章目录 :apple: 业务需求描述 🍎 业务需求描述 测试案例: https://pan.quark.cn/s/3f58972f0a27 官网地址: 需求描述: 点击获取数据接口,调用后台,将从后台查询到的数据回写到表单的内容中。 如下…

51c嵌入式~继电器~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/13775821 一、继电器应用细节 继电器的应用,相信大家都知道,在电路中只要给它供电、断电也就可以工作了。本文讨论它的应用细节。 现在流行的接法 图中,继电器的线圈经过Q1作为开关&am…

前端性能优化核弹级方案:CSS分层渲染+Wasm,首屏提速300%!

前端性能优化核弹级方案:CSS分层渲染Wasm实现首屏提速300%的终极指南 在当今Web应用日益复杂的背景下,性能优化已成为前端开发的核心竞争力。本文将深入剖析两种革命性的前端性能优化技术——CSS分层渲染与WebAssembly(Wasm)的协同应用,揭示…

初识Redis · 简单理解Redis

目录 前言: 分布式系统 开源节流 认识Redis 负载均衡 缓存 微服务 前言: 本文只是作为Redis的一篇杂谈,简单理解一下Redis为什么要存在,以及它能做到和它不能做到的事儿,简单提及一下它对应的优势有什么&#…

网络通讯协议UDP转发TCP工具_UdpToTcpRelay_双向版

UDP/TCP网络转发器程序说明书 1. 程序概述 本程序是一个高性能网络数据转发工具,支持UDP和TCP协议之间的双向数据转发,并具备以下核心功能: 协议转换:实现UDP↔TCP协议转换数据转换:支持十六进制/ASCII格式的数据转…

MCP 服务搭建与配置学习资源部分汇总

MCP 服务搭建与配置学习资源汇总 目录 图文教程GitHub 示例项目视频课程不同开发语言实现案例 图文教程 Cherry Studio 配置 MCP 服务教程 – 介绍如何在 Cherry Studio 客户端中配置 MCP 服务器,让 AI 模型能够自主调用本地/网络工具来完成任务,提升…

Selenium中`driver.get(htmlfile)`方法可能出现的超时问题

针对Selenium中driver.get(htmlfile)方法可能出现的超时问题,以下是几种改进方案及具体实现方法: 1. 设置页面加载超时时间 通过set_page_load_timeout()方法直接控制页面加载的最大等待时间。若超时,会抛出TimeoutException异常&#xff0c…

20分钟了解 MMAction2 框架设计

步骤3:构建一个识别器 # 修改此处 predictions[0].pred_score -> predictions[0].pred_scores.item print(Scores of Sample[0], predictions[0].pred_scores.item)步骤4:构建一个评估指标 # 修改此处 data_sample[pred_score].cpu().numpy() ->…

单轨小车悬挂输送机安全规程

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。欢迎大家使用我们的仓储物流技术AI智能体。 新书《智能物流系统构成与技术实践》 新书《智能仓储项目出海-英语手册,必备!》 完整版文件和更多学习资料&#xf…

C++之多态

文章目录 一、多态的概念 多态的定义与类型 二、多态的实现 三、虚函数 虚函数的概念 虚函数的重写/覆盖 协变 析构函数的重写/覆盖 override,final关键字 override final 纯虚函数与抽象类 三个概念辨析 四、多态实现的原理 虚函数表指针 动态绑定与静态绑定 …

深入理解 HTML5 Audio:网页音频播放的新时代

在网页开发领域,音频的嵌入和播放一直是一个重要且不断演进的话题。HTML5 的出现,为网页音频播放带来了标准化的解决方案,极大地改善了开发者和用户的体验。 一、HTML5 之前的音频播放状况 在 HTML5 诞生之前,互联网上缺乏统一的网页音频播放标准。当时,大多数音频播放依…

重载和重写的区别

重载 在同一个类中定义多个同名方法, 但参数列表不同(参数类型、参数个数或参数顺序不同)返回值类型不同。 public class MathOperations {int add(int a, int b) {return a b;}double add(double a, double b) {return a b;} }重写 子…

机器视觉+深度学习,让电子零部件表面缺陷检测效率大幅提升

在精密加工的3C电子行业中,一抹0.1毫米的油渍,一粒肉眼难辨的灰尘或将引发整机性能隐患。当制造业迈入微米级品质竞争时代,产品表面看似微不足道的脏污缺陷,正成为制约企业高质量发展的隐形枷锁。分布无规律的污渍斑点、形态各异的…

Dart逆向之函数调用

我们从Blutter恢复的部分IL中可以看到Dart调用函数的逻辑 // 0x180490: r16 <int> // 0x180490: ldr x16, [PP, #0x8a0] ; [pp0x8a0] TypeArguments: <int> // 0x180494: r30 Instance_MethodChannel // 0x180494: ldr lr, [P…

如何白嫖Grok3 API? 如何使用Grok3 API调用实例?怎么使用Grok3模型?

前段时间&#xff0c;Grok3&#xff08;想要体验Grok3的童鞋可以参考本文&#xff1a;Grok 上线角色扮演功能&#xff0c;教你课后作业手到擒来&#xff0c;Grok3使用次数限制&#xff1f;如何使用Grok3? Grok3国内支付手段如何订阅升级Premium - AI is all your need!&#x…

《超短心法》速读笔记

文章目录 书籍信息概览主线行业篇战法一 人气涨停战法战法二 四维主线战法 主线龙头篇战法三 龙头起爆战法战法四 六合强庄控盘战法战法五 筹码战法之七星连珠 趋势牛股篇战法六 趋势擒龙之暴涨形态战法七 趋势破位起爆战法战法八 强中选强多头战法 涨停晋级篇战法九 强势涨停狙…