【网络基础】通俗易懂的了解HTTPS的整体过程

2023-11-06

前言

HTTP协议是个系统的知识领域,作为Web项目开发的开发人员需要掌握,但平时没那么多的精力单独对这一块进行系统的学习,然而我们还是需要稍微了解一些知识点,方便普通的开发工作也能对付面试。

这篇就来简单的讲解一下HTTPS的整体过程,讲的会不严谨,请大佬勿喷~


HTTP

首先讲下什么是HTTP,中文名称为 “超文本传输协议”。我靠,如果第一次接触是不是感觉很抽象哈哈。没事我们拆开讲。

  • 协议:就是个规则(规范),只要计算机遵循这个规则,就能相互通信。
  • 传输:说明可以输送信息而且是双方(请求方响应方)的,A可以传给B,B可以传给A。AB之间可以加入CD…,称为“中间人”,中间人遵循协议,也能对这个传输过程做一些事(例如安全认证、编码转换等)。
  • 超文本:就是超越了普通文本的文本,不再是二进制包,可以是文字,图片,音频、视频等的混合体。

总结一下,什么是HTTP,可以说是一个在计算机世界里专门在两点之间传输文字,图片,音频、视频等的超文本数据的约定和规范

补充:这个HTTP协议还需要配合其他协议(TCP/IP、DNS、SSL/TLS等)构成一个完整的使用生态。同时很多技术(WebSocket等)也都依赖与它。

各个版本

1.0:

  • 只支持get,post方法。1.0这个版本一般面试官不会问,太久远了。
  • 每次发起http都要重新TCP

1.1:

  • 新增强缓存和协商缓存
  • 可以一次TCP链接,后续就可以多次请求,也就是支持长连接(默认Connection: keep-alive
  • 支持断点续传,传一部分后返回206,接着再传一部分,返回206,直到完成所有上传,返回200(大文件断点上传)
  • 新支持put、delete等,可以用于restful api

2.0:

这个面试会重点问,2解决了1和1.1历史以来的一个痛点问题。在1.1中,并发请求的时候,有个问题,就是a先发b后发,如果b先响应要等a响应返回数据后,自己再返回数据(这是为了通过顺序的保证,让浏览器知道返回的数据属于哪次请求的)。

你说实际情况看不是我说的这样子?可以打开控制台看看:

在这里插入图片描述

连接ID的意思是哪次TCP的链接建立起来的http请求,一个ID对应一次TCP连接。

你看这个两个请求的时间线,是不是严格按顺序响应的。其他请求为了不想发生这种阻塞现象,浏览器会自动的新起TCP连接。一般会创建6个TCP连接,每个TCP连接可能会有多个http连接使用。这样子看,是不是有点回到HTTP1版本那味了。

所以在2中,把这个问题解决了,用了多路复用的技术。只要一次TCP连接中可以多个http并发请求(通过把响应数据拆分成帧,每个帧做同个请求的标记,就可以知道那个帧属于哪个请求的了,就不需要通过顺序的关系确认请求返回的数据了)。

还有:

  • 可以压缩请求头header,减少请求体积(20%)
  • 支持服务端推送(就是请求一个index.html时,主动把后面要用到的静态文件推给客户端,和webpack是两个东西)

每个升级都能深入提问,看你侧重了

结构

一个HTTP请求,包含了请求行、请求头和请求体。

请求

请求行

一般组成结构为:请求方法+路径+参数+hash+协议版本

例如:POST /xxx/user/xxx HTTP/1.1

请求头

请求头中有很多参数,我只挑些重要的记录。

Content-Type设置请求体格式:

  • application/x-www-form-urlencoded表示请求体格式按照get那样拼接的传,现在已经不会有这种做法了
  • application/json表示请求体的格式是json对象格式
  • multipart/form-data上传文件格式

请求体

就是POST请求中和后端定义好的入参。

响应

响应行

一般结构为:协议版本+状态码和状态,例如HTTP/1.1 200 OK

响应头

也只挑重要的,例如Content-Type,告诉浏览器返回的数据是什么格式,图片?css文件?html文件?浏览器根据数据格式做对应的解析。

响应体

Content-Type是什么类型,响应体就对应那个类型的数据。


HTTPS

普通的HTTP传输的过程的安全性相当于裸奔,就像别人给你寄个没有箱子装的快递一样,我们暂且先把这样的快递叫做明文,HTTPS就是给这个快递用了一些安全手段进行加密装箱,暂且先把这样的快递叫做密文

用了哪些安全手段呢?安全手段是通过历史一步一步完善的,请听我娓娓道来~

对称加密

什么叫对称,就是请求方和响应方手里的秘钥是一样的。

比如浏览器给服务端发送数据的时候,会用秘钥把数据加密,经过一个算法处理成密文。然后把秘钥和密文都发给服务端。服务端再拿这个秘钥解开密文,经过一个算法拿到数据。

  • 好处:服务端的容量负担小,他给不同浏览器的秘钥都是一样的。

  • 坏处:如果中间人拿到秘钥和密文,数据就泄漏了。

非对称加密

这时候就有了非对称加密,非对称的意思是请求方和响应方手里的秘钥不一样了。我们的秘钥分为了公钥和私钥。有啥特点呢?

  1. 任何经过A的公钥进行加密的信息,只有A的私钥才能解开;
  2. 任何拥有私钥的人可以确认对方发送的信息是被公钥加密过的;

有点懵没事,举例子:首先浏览器向服务端索要公钥,用这个公钥加密数据,经过算法处理成密文发送给服务端;服务端拿到密文知道是用自己的公钥加密过的(对应第二个特点),用私钥解密密文(对应第一个特点),经过一个算法拿到了数据;

服务端向浏览器获取公钥的过程也是一样的,毕竟双方都要向对方发送数据。

不过如果服务端都向各路浏览器索要公钥进行加密,用户数量庞大,服务端顶不住这么多次的索要,而且非对称的加密相对于对称加密性能开销大,所以服务端吃不消。

对称和非对称结合加密

为了解决以上两者方法的缺点,鬼才们想到了将二者进行了结合。

  1. 先用非对称加密让双方都拿到相同的秘钥:例如,浏览器向服务端索要公钥,把一个秘钥K加密,发给服务端,服务端私钥解密拿到秘钥K。这样双方都拿到了私钥K。

  2. 再用对称加密传输数据:接下来,浏览器只需要用私钥K把数据加密,经过一个算法处理成密文,只把密文发送给服务端,服务端用私钥K就可以解密了。

CA证书中级大发

应对这种结合的加密,黑客这边也有鬼才想到新对策。

中间人拿到服务端的公钥A后,自己也生成一对公钥B和私钥B,用公钥B给浏览器,假装自己是服务端。然后浏览器用公钥B给私钥C加密,给中间人截取到,中间人再拿私钥B解密拿到私钥C,用公钥A加密私钥C,给服务器。最终,可恨的中间人拿到了私钥C。

好家伙!我们这边也不甘示弱啊,搞了个CA认证证书来解决这个问题。

CA是个权威机构,专门审核颁发数字证书的。其中的SSL证书就是用于HTTPS加密协议用的证书。

首先看一个服务端获取SSL证书的大致流程。

首先服务器生成自己的公钥和站点相关信息发送给CA,再由CA对其进行加签处理,由此得到服务器的证书。

加签中大概就是CA针对这个服务端,生成一个公钥A和私钥A,这个私钥A是存在CA机构里的不公开的。然后用私钥A去加密服务器的提交给CA的公钥B,再用私钥A去加密证书签名(这玩意干嘛的后面说),这些内容和网站的相关信息组合就成为证书。公钥A是公开给全世界的,用来解密。

当中间人想伪造证书时,用公钥A解密拿到公钥B,然后用自己的私钥C去重新加密。浏览器拿到证书后,用公钥A发现无法解密,就判断证书有问题。中间人就无可奈何了。

然后来说说证书签名,这玩意里面有证书信息(域名信息等)+公钥A+公钥B。有啥用呢,如果中间人改了证书里的域名信息,就能通过解密证书签名里的域名信息对照。

证书、对称和非对称结合加密

有了证书再结合对称和非对称加密,就可以防止中间人搞事了。

  • 先拿证书,做证书真伪校验,是真的,就拿里面的公钥,能保证这个公钥就是服务端的
  • 然后再进行对称和非对称结合加密的步骤

所以HTPPS本质上就是为了解决中间人攻击。

证书关系链(拓展知识)

证书会对应的生成证书内容的签名,并将该签名使用CA的私钥进行加密得到证书指纹,并且与上级证书生成关系链。

什么叫 “与上级证书生成关系链” ,拿百度举例:

可以看到百度是受信于GlobalSign G2,同样的GlobalSign G2是受信于GlobalSign R1,当客户端(浏览器)做证书校验时,会一级一级的向上做检查,直到最后的根证书,如果没有问题说明服务器证书是可以被信任的。

证书包含什么信息:

  • 颁发机构信息
  • 公钥
  • 公司信息
  • 域名
  • 有效期
  • 指纹
  • ……

证书的合法性验证(拓展知识)

  • 颁发机构是否够客户端信任,不信任就弹出安全风险提示
  • 证书是否被调销?
  • 证书是否过期?
  • 验证证书内容,例如是否有证书私钥,域名是否一致等

HTTPS的整体过程

好了,终于可以捋捋整个过程了。主要分为两个阶段:

证书验证阶段

  1. 浏览器发起 HTTPS 请求。
  2. 服务端返回 HTTPS 证书(含公钥)。
  3. 客户端验证证书是否合法,如果不合法则提示告警。

数据传输阶段

  1. 当证书验证合法后,在本地生成秘钥K。
  2. 通过服务端的公钥加密秘钥K成密文,传输到服务端。
  3. 服务端通过私钥进行密文解密得到秘钥K。
  4. 服务端通过客户端传入的秘钥K利用对称加密算法,对返回数据进行加密后传输。双方就此通过对称加密传输数据。

小知识:第一次响应数据中,浏览器只能先接收14kb的数据,之后才变大。


HTTP请求在哪看

在浏览器的控制台网络请求里,我们点击一个请求来看,一个请求信息其实包含了去和回:

Headers:请求头
在这里插入图片描述
后续有空我再详细补充一下。


一个https网站嵌套一个http网站可以吗

不行

  • 浏览器的安全策略,在https的请求里会将http的访问block掉。
  • 控制台会提示:http域名的页面是通过https域名页面加载的,在一个安全的页面不允许加载一个不安全的路径的页面;

解决

  • 改为https
  • 都在浏览器里面的设置–设置隐私和安全性–网站设置–不安全内容–允许–添加那两个域名

其他情况

  • http套http支持
  • http套https支持

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

【网络基础】通俗易懂的了解HTTPS的整体过程 的相关文章

  • WCF - 进行多次调用时随机客户端超时

    我有一个WPF客户端通过以下方式请求数据WCF服务托管于IIS 7 服务方法调用存储过程 SQL 2012 using EF检索一些数据 由于需要加载大量数据 因此客户端会多次调用服务方法 以 分解 数据加载并避免大量负载和超时 我们使用生
  • Non-Authoritative-Reason 标头字段 [HTTP]

    当我有响应标头时 我很难找出它的含义Non Authoritative Reason HSTS 我搜索了很多 但只是想出了一些关于 HSTS 从 HTTP 重定向到 HTTPS 的解释 有人能帮我吗 顺便说一句 我正在使用 Chrome T
  • gRPC(HTTP/2) 比使用 HTTP/2 的 REST 更快吗?

    目标是引入一种性能更好的传输和应用层协议latency and 网络吞吐量 目前 该应用程序使用REST with HTTP 1 1并且我们遇到了很高的延迟 我需要解决这个延迟问题并且我愿意使用gRPC HTTP 2 or 休息 HTTP2
  • 使用node.js/Express从HTTP重定向到HTTPS

    有什么方法可以更改我的 Web 应用程序以侦听 HTTPS 而不是 HTTP 我正在使用node js express 我需要它来侦听 HTTPS 因为我正在使用地理定位 而 Chrome 不再支持地理定位 除非从 HTTPS 等安全上下文
  • 是否可以在ajax get请求中获取页面的一部分?

    我知道我们可以在向服务器发出 GET 请求时获取整个页面 但是如果我只对该页面上的一个特定 div 感兴趣 或者更准确地说对其内容感兴趣 该怎么办 这里唯一的选择是获取整个页面 例如使用 jquery find 从中获取 div 内容吗 或
  • 如何测试“If-Modified-Since”HTTP 标头支持

    使用 PHP 如何准确测试远程网站supports If Modified Since HTTP 标头 据我所知 如果您获取的远程文件自标头请求中指定的日期以来已被修改 它应该返回 200 OK 状态 如果尚未修改 则应返回 304 Not
  • Golang 优雅地关闭 HTTP 服务器并进行错误处理

    我正在让我的 HTTP 服务器正常关闭 我从帖子中获取了提示here https stackoverflow com questions 39320025 how to stop http listenandserve 并且到目前为止已经像
  • HTTP 到 HTTPS 301 重定向代码不起作用,显示重定向过多

    我正在为我的网站之一使用 Bluehost 最近 最近 我已将我的网站从 HTTP 迁移到 HTTPS 之后 我使用了不同的代码 包括以下代码 在我的网站上强制使用 HTTPS SSL Rewrite RewriteEngine On Re
  • 无对等证书例外 - Volley 和具有自签名证书的 Android

    我正在尝试让我的应用程序通过 https 与我的服务器通信 由于我不想付费让受信任的 CA 签署我的服务器证书 解决方案是使用自签名证书 因此 我创建了 caconfig cnf 如下所示 ca default ca CA default
  • 服务器返回网页 404,但页面在浏览器中显示正常 - 为什么?

    一个奇怪的网页横亘在我面前 作为一名开发人员 我必须解开这个谜团 在任何浏览器中访问网页时 一切似乎都很正常 网页按预期显示 但是当查看控制台时 服务器实际上返回了 404 状态代码 那么浏览器为什么要渲染页面呢 查看正文显示返回了有效的
  • 在 Go 中跟踪 HTTP 请求时指定超时

    我知道通过执行以下操作来指定 HTTP 请求超时的常用方法 httpClient http Client Timeout time Duration 5 time Second 但是 我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作
  • 将 HttpApi 与 I/O 完成端口结合使用

    我刚刚偶然发现了微软的HTTP 服务器 API http msdn microsoft com en us library aa364510 28v vs 85 29 aspx 简介中写道 HTTP 服务器 API 使应用程序能够通过 HT
  • 如何确定服务器是否支持 Range 标头?

    我一直在尝试使用 Range 标头值从特定点流式传输音频 但我总是从一开始就得到歌曲 我正在通过程序执行此操作 因此不确定问题是否出在我的代码中或服务器上 如何确定服务器是否支持 Range 标头参数 Thanks 方式HTTP规范 htt
  • iOS 上的多个 HTTP 请求与单个 TCP 连接

    我正在开发一个 iPhone 应用程序 它使用我控制的基于 Web 的 API 连接到持续打开的 TCP 端口并通过 TCP API 发出请求 或者为我想要获取的所有数据发出新的 HTTP 请求 会更快或更高效吗 我认为差异可以忽略不计 但
  • ASP.NET Core URL 重写

    我正在尝试将我的网站从 www 重定向到非 www 规则以及 http 到 https https example com https example com 在中间件中 我曾经在 web config 中进行这些重定向更改 例如
  • RestSharp RestClient的默认超时值是多少?

    任何人都知道默认超时值休息锐利 https github com restsharp 休息客户端 RestSharp 在底层使用 HttpWebRequest 它有一个默认超时 https msdn microsoft com en us
  • Android - API 请求

    我开发了一个应用程序 它也在 iPhone 上 问题出在 api 请求上 我为所有请求设置了超时 有时会出现 30 60 秒的中断 看起来这个应用程序执行了几个请求 然后就中断了 一直超时 大约 45 秒后一切正常 不知道是服务器问题还是安
  • python 2.7 中的 HTTP 2 请求

    在 python 中向 HTTP 1 和 HTTP 2 发出请求有什么区别吗 我可以像这样在 python 中进行 HTTP 1 x 调用 url http someURL values param1 key param2 key2 dat
  • 如何使用 python 的 http.client 准确读取一个响应块?

    Using http client在 Python 3 3 或任何其他内置 python HTTP 客户端库 中 如何一次读取一个分块 HTTP 响应一个 HTTP 块 我正在扩展现有的测试装置 使用 python 编写 http clie
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置

随机推荐

  • 基于51单片机的水箱水位监测控制系统proteus仿真原理图PCB

    功能介绍 0 本系统采用STC89C52作为单片机 1 通过传感器监测水位 当水位低于水位下限时 接通加水水泵 直到水位达到水位上限 停止加水 2 水位低于水位下限时 声光报警 3 可按键手动加水 直到水位达到水位上限 停止加水 4 采用D
  • Axure基础:母版与内联框架

    一 母版 1 母版的作用 母版是解决了我们页面中的重复元素和同步改动的问题 举个例子在两个页面中假设都有这个元素和界面 那我如果我们不用母版 用常规手段就是复制黏贴 但这样没办法保证我们数据同步问题 如果改动其中一个元件 另一个元件没办法同
  • 陀螺解读

    出品 陀螺研究院 区块链是在数字世界围绕数据的记录 组织和传播创造的共建 共享 共治的应用范式 作为一种能够满足数字经济发展需求的关键技术 区块链可有效赋能产业转型 聚力推动产业经济价值 2019年10月24日 中共中央政治局明确把区块链作
  • 马氏距离-Mahalanobis Distance

    Mahalanobis距离是表示数据的协方差距离 它是一种有效的计算两个未知样本集的相似度的方法 与欧氏距离不同的是它考虑到各种特性之间的联系 与欧氏距离不同的是它考虑到各种特性之间的联系 例如 一条关于身高的信息会带来一条关于体重的信息
  • IDEA生成JSON字符串

    第一步 先书写以下基本程序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package cn lianxi cn lianxi json Author Wxz Date 2020 8 19 16 45 pu
  • UVa1614

    这道题是一道好题 我想了很久都没有想出合适的方案 这道题考了我们贪心 不确定 数学推导 确定 的能力 看来我的数学逻辑以及推理能力还需要加强啊 题意不说 直接上思路 由于1 lt ai lt i的条件 我们需要从这里入手求解 首先 我们需要
  • Vue判断字符串(或数组)中是否包含某个元素

    Vue判断字符串中是否包含某个字符串 方法有好多种 这里暂时先说我知道的两种 以后知道了别的 会继续更新 方法一 includes方法 数组 字符串都可以 var str Hello World if str includes World
  • 关于多层感知机(MLP)你必须知道的20个知识点

    问题1 MLP的基本组成单元是什么 答 MLP的基本组成单元是神经元 neuron 它通过激活函数对输入进行加权求和和非线性变换 问题2 MLP通常有几层 答 MLP通常有输入层 隐藏层和输出层 隐藏层可以有一层或多层 问题3 MLP的训练
  • 配置ntp客户端与服务器端时间的同步

    1 实验机器介绍 Ip地址 服务器1 192 168 245 128 服务器2 192 168 245 130 客户端1 192 168 245 129 实验前准备 在ntpS1 和ntpS2 中 配置外部服务器为同步服务器 并开放给192
  • 前端内存泄漏和溢出的情况以及解决办法

    写在前面 在平时写代码时 内存泄漏的情况会时有发生 虽然js有内存回收机制 但在平时编程中还是需要注意避免内存泄漏的情况 前几天做移动端时遇到一个内存泄漏造成移动端页面卡顿的问题 所以想总结下前端内存泄漏的情况 回顾下基础知识 一 什么是内
  • RPM 的 spec 文件如何编写

    在关于 RPM 软件包构建的上一篇文章中 你了解到了源 RPM 包括软件的源代码以及 spec 文件 这篇文章深入研究了 spec 文件 该文件中包含了有关如何构建 RPM 的指令 同样 本文以 fpaste 为例 了解源代码 在开始编写
  • 全球及中国汽车用导航行业应用前景与销售渠道分析报告2022-2028年

    全球及中国汽车用导航行业应用前景与销售渠道分析报告2022 2028年 修订日期 2022年1月 专员对接 周文文 查询鸿晟信合研究院了解详细内容 第一章 汽车用导航产业概述 1 1 汽车用导航定义及产品技术参数 1 2 汽车用导航分类 1
  • Idea:修改新项目默认设置

    修改Idea新项目默认设置 使用idea开发时 即使在settings设置项目配置 如maven 在新建项目也会发现项目配置变为默认 这时需要设置新建项目配置 配置步骤 File New Projects Setup Settings fo
  • Log4j 配置文件(log4j.properties)的所在路径问题

    一般我们直接将log4j properties放置在src目录下 这样系统自动会找到的 其实就是放在WEB INF classes文件下 这个路径在classpath下 所以直接就能找到 我们写Logger的时候如下 public clas
  • Servlet配置、会话管理——Servlet【总结】

    Servlet配置 初始化参数 Servlet除了可以从请求信息中获取信息外 还可以从配置文件中获取配置参数信息 配置文件中的参数信息与具体的请求无关 而是Servlet初始化时调用的 如此可以避免硬编码信息 提高Servlet的可移植性
  • 创建的源文件后缀不是.c,在一些编译器上不能编译

    问题描述 源文件的名字和后缀写的比较随意 后缀不是 c 代码没有语法高亮 可能在一些编译器上不能编译通过 现象 解决办法 C语言代码中我们有约定 源文件的后缀是 c 头文件的后缀是 h 这样在大部分的IDE中代码打开都是有语法高亮的
  • 想学软件开发做程序员,学习Python必备的Python从入门到精通约650GB全面学习资料

    先简单介绍一下Python的情况 后面文章最后附有零基础自学Python从入门到精通学习Python的视频文档源码低阶到高阶等全面学习资料约650GB 1 什么是PythonPython 是一个有条理的和强大的面向对象的程序设计语言 类似于
  • 使用 Selenium 和 Python 爬取股票网站历史资金数据的简易教程

    一 需求及技术介绍 在金融投资领域 了解股票市场的历史资金数据对于制定投资策略和做出明智的决策至关重要 这些数据包含着股票的交易量 资金流向 持股比例等关键指标 能够为投资者提供有价值的参考和分析依据 通过利用 Selenium 模拟浏览器
  • Debug-CDK编译

    问题描述 make No rule to make target xxx c needed by Obj xxx o Stop 解决方法 删掉obj文件夹 重新编译
  • 【网络基础】通俗易懂的了解HTTPS的整体过程

    文章目录 前言 HTTP 各个版本 结构 请求 请求行 请求头 请求体 响应 响应行 响应头 响应体 HTTPS 对称加密 非对称加密 对称和非对称结合加密 CA证书中级大发 证书 对称和非对称结合加密 证书关系链 拓展知识 证书的合法性验