大话Https协议,弄清http、SSL、TLS
zhezhongyun 2025-01-01 23:39 54 浏览
大家现在访问网络,浏览网页,注意一下的话,网址前面基本上都是一个 https:// 的前缀,这里就是说明这个网址所采用的协议是 https 协议。那么具体应该怎么理解 https 呢? 本文我们就力争能清楚地解释明白这个我们目前应该最广的协议。
理解HTTP协议
要解释 https 协议,当然首先应该知道 http 协议。http 协议可以说是现代互联网的基础。在现代网络的 OSI 七层模型中,http 是典型的第 7 层应用层协议。也就是它是基于网络通信的实际应用,比如浏览器呈现网页内容,这就是网络通信的具体应用。
如下图分别是 http 协议的消息请求和响应报文的协议定义格式:
访问百度的请求解析如下:
GET https://www.baidu.com/ HTTP/1.1
#请求方法 URL HTTP协议版本
Host: www.baidu.com
#请求服务器地址
#以下是消息头内容
Connection: keep-alive
#连接方式:长连接
Cache-Control: max-age=0
#请求缓存控制,需确认请求内容是否有修改
Upgrade-Insecure-Requests: 1
#支持https协议
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
#请求客户端,浏览器版本
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
#支持的响应内容类型
Accept-Encoding: gzip, deflate, br
#支持的编码类型
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
#支持的语言
Cookie: BAIDUID=C0A2...
#携带的cookie信息
#未携带请求消息体,body为空
响应解析:
HTTP/1.1 200 OK
#协议版本 消息状态码 状态描述
Bdpagetype: 2
Bdqid: 0x8707d7d80001f34e
#自定义消息头
Cache-Control: private
#缓存控制策略
Connection: Keep-Alive
#长连接
Content-Type: text/html;charset=utf-8
#响应内容类型
Date: Sat, 22 Dec 2018 08:54:51 GMT
#响应时间
Expires: Sat, 22 Dec 2018 08:54:51 GMT
#过期失效时间
Server: BWS/1.1
#服务器系统及版本
Set-Cookie: BDSVRTM=372; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: path=/; domain=.baidu.com
#设置客户端cookie
Strict-Transport-Security: max-age=172800
#严格安全传输,有效时间
X-Ua-Compatible: IE=Edge,chrome=1
#兼容浏览器版本
Content-Length: 191722
#消息体长度
#以下消息体内容
<!Doctype html>
<html xmlns=http://www.w3.org/1999/xhtml><head>
...
关于 http 协议的详细说明,可以参照我之前的博文 《接口测试工具Postman-基础篇》中关于 http 协议基础的部分
那这里其实请求的地址 Url 是 https://www.baidu.com, 是https协议,为什么这里又说它是 http 协议呢? 这两者到底是什么关系?
HTTPS协议和TLS、SSL
其实 https 协议是指 HyperText Transfer Protocol over Secure Socket Layer,也就是基于SSL之上的HTTP协议。
SSL(Secure Socket Layer) 指安全套接字层,是互联网鼻祖公司网景(Netscape)提出的为网络通信提供安全性和隐私保护的标准协议。 发展到 SSL3.0版本后,标准组织 IETF 对 SSL 协议进行了标准化,并重新命名为 TLS(Transport Layer Security,传输层安全)。目前更新到 TLS1.3 版本。
所以说SSL和TLS其实是一脉相承的,可以认为二者其实是不同时期的同一个协议。而HTTPS协议其实就是: > HTTPS = HTTP + SSL/TLS
为什么需要 https 协议呢? 因为http协议本身在传输过程中,传递的信息基本都是透明的,传输过程中的任何节点,其实都可以看到传输的消息体内容。
因此为了安全起见,就有了对传输内容加密的需求,SSL/TLS 协议的作用,其实就是为了保护这个内容安全而推出的。
从 TLS 协议的命名也可以看出,它其实是在 TCP 协议(传输控制协议)的基础上,增加了安全特性的一个协议。
HTTPS 协议基于HTTP协议,所以它还是属于应用层协议,而TLS 是在第四层的TCP协议基础上,一般认为是属于第五层即会话层。
通过TLS,可以实现网络通信传输过程中,通信数据的加密
关于加密
那么理解 https 协议,这里也就是要搞清楚 TLS 是怎么对通信数据完成加密的。
对称加密
我们正常理解加密,就是通过双方约定的一个规则,也就是通过加密算法,把原始字串变更为一个只有通信双方知道的密文,这样其他人即便知道通信内容,就并不能知道原始的信息。
比如我们看谍战片,传递情报一般都有个重要的东西叫做 密码本, 这里密码本其实就是加密算法,也就是密钥。
这种加密方式,双方是对等的,对通信内容加密和解密使用的是同一个密钥,因此叫 对称加密
但这种加密方式,有一个最大的问题,就是这里的密码本。谍战片中,情报人员舍生忘死也要保护密码本,否则一旦泄露,情报就存在泄露风险。
网络通信也是一样,这里最大的问题,就是这里的密钥如何避免泄露。但只要密钥本身也需要通过网络通信来传输,那么依然不安全。
这个过程好比:
A: 跟你说个秘密,我下面的话你不要直接听,我全部说第几页第几行第几列,你去《红楼梦》找到对应的字连起来读。你回话也告诉我对应字的位置就行
B: 好嘞,《红楼梦》已摆好,你说吧
。。。。
C:我偷听到啦,赶快买本《红楼梦》去...
非对称加密
而除了对称加密之外,还有一种加密方式是 非对称加密, 这种方式会采用一些特殊的加密算法,生成两份密钥,分为 公钥 和 私钥, 通过其中一把钥匙加密的内容,只能通过另一把要是才能解密。并且这个算法是很难通过暴力破解逆向还原推导仿冒出另一把钥匙。
类似古代调遣军队的虎符,只有双方严丝合缝对得上才能验证为真。
有了这个机制,就可以把私钥保存在自己这里,并且绝不外传,而公钥可以公告天下,通过网络正常传递,谁都有可能拿到。这样,对方要给我发送加密信息,只要使用公钥加密,而解密只能在我自己这里才能完成。
所以,非对称加密大致的过程就是:
A: 我有点秘密想跟你说, 不能被其他人听到....
B:稍等,我给你个公钥,你上个锁以后再说给我听。拿到公钥先念下公钥上的字给我看看对不对
A: 收到公钥,上面写着“我是王大锤”
B: 对,你收到的就是我给你的公钥,用它上锁吧
A:公钥加密上锁,打包发给B
B:取出私钥,打开包裹,阅读内容...
相比 对称加密,非对称加密明显更加安全,但这种方式的缺点是计算量比较大,加解密过程效率不高,速度较慢,所以实际应用中,通常是两种方式结合使用。
也就是 TLS 加密过程: > 双方会首先通过非对称加密过程,协商出一个用于通信的对称密钥;这个对称密钥的生成都在各自的本地完成,而完成密钥协商后,后方各自都有了一个相同的对称密钥,就可以基于这个相同的密钥进行后续对称加密通信。
因为这个对称密钥是通过非对称加密的方式得到的,所以并不会在双方的通信过程中传递。这样就兼顾了安全和效率。
签名和证书
不过用非对称加密,还是存在一个漏洞。
就是在服务器和客户端通信的过程中,通信过程其实会通过大量中间环节,如果存在一个恶意的劫持者,它在收到服务端信息后,想自己假冒服务端,篡改信息后再发给客户端。
这时它其实可以伪装成服务端,自己给客户端发放公钥,拿到客户端的信息后,用自己的私钥解密,再用真正的服务端公钥重新加密,发给服务端。
这个风险其实就是安全领域中的 中间人攻击 漏洞。
而为了规避这个问题,需要服务端应该证明自己的身份,然后客户端还可以验证这个身份。因此就有了签名和证书。
签名就是服务端表明自己的身份,拿到公钥的客户端就可以通过签名判断这个发送端是正确的服务器。这里的签名和公钥其实都保存在一个文件中,也就是服务端的签名证书。
而为了防止中间人伪造证书,这时就引入了CA(Certificate Authority),也就是权威的第三方证书颁发机构。这些权威的第三方颁发机构会用私钥对服务端的签名进行加密,这样客户端就可以通过机构的公钥来验证这个签名是否是对应的服务端。验证无误,就可以用证书中携带的公钥来完成和服务端后续的通信协商。
HTTPS协议交互过程
有了上面的基础,我们来具体看一下访问一个 https 网站的具体通信过程。
TLS因为有不同的版本,并且支持多种不同密钥交换和加密算法,所以在通信前,首先要完成使用何种加密算法、用什么密钥生成方式等过程。而 TLS 是基于TCP协议之上的,所以在 TCP 典型的 3次握手完成建链之后,会进行 TLS 的握手建链过程:
- 比如客户端从浏览器访问网站, 这时浏览器会首先发送Client Hello 消息到服务器,这个消息中主要包含了客户端支持的加密套件ciphersuites, TLS 版本信息和客户端随机数。(明文传输)
- 服务器接收到消息后,返回自己支持的ciphersuites, TLS 版本,自己的数字证书和服务器端生成的随机数等几项内容。(明文传输)
- 客户端对收到的数字证书进行验证。验证无误之后生成一个新的密钥,也就是预主密钥pre-master key,并使用证书中携带的公钥来对pre-master key进行加密,发送给服务器。(此时是非对称加密传输)
- 服务器接收到客户端的密文,使用私钥进行解密,获得了pre-master key。(非对称加密传输)
- 到这里为止,服务器和客户端都有了三组数字,分别是客户端的随机数、服务端的随机数和pre-master key。前两个随机数虽然是明文传输,有泄露风险,但 pre-master key并没有在通信中传递,是计算而得到的安全密钥。 所以再将这三者结合,使用之前协商好的特定的加密算法再生成一个密钥,这个密钥称为shared secert。也就是之后的会话密钥,这个密钥是后续对称加密的密钥。
- 客户端在计算出对称加密的密钥之后,使用该密钥对通信内容进行对称加密,告知服务器之后都使用该密钥进行对称加密。(对称加密传输)
- 服务器接收到密文后,使用之前计算出的密钥来进行对称解密,解密成功之后,同样再使用该密钥进行对称加密通信。并告知客户端密钥确认无误,可以使用该密钥进行通信。(对称加密传输)
至此,整个TLS的握手过程完整,之后就可以开始对称加密的通信了。
通过 WireShark 抓包的话,通常是这样的一个过程:
具体的交互过程,参考下图 (图片来自网络
以上就是关于 Https 协议通信过程的整体梳理,更多测试和技术相关文章,欢迎关注 城下秋草的博客 或公众号(秋草说测试)
相关推荐
- JavaScript中常用数据类型,你知道几个?
-
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师Lison这篇文章我们了解一下JavaScript中现有的八个数据类型,当然这并不是JavaScr...
- 踩坑:前端的z-index 之bug一二(zh1es前端)
-
IE6下浮动元素bug给IE6下的一个div设置元素样式,无论z-index设置多高都不起作用。这种情况发生的条件有三个:1.父标签position属性为relative;2.问题标签无posi...
- 两栏布局、左边定宽200px、右边自适应如何实现?
-
一、两栏布局(左定宽,右自动)1.float+margin即固定宽度元素设置float属性为left,自适应元素设置margin属性,margin-left应>=定宽元素宽度。举例:HTM...
- 前端代码需要这样优化才是一个标准的网站
-
网站由前端和后端组成,前端呈现给用户。本文将告诉您前端页面代码的优化,当然仍然是基于seo优化的。 就前端而言,如果做伪静态处理,基本上是普通的html代码,正常情况下,这些页面内容是通过页面模...
- 网页设计如何自学(初学网页设计)
-
1在Dreamweaver中搭建不同的页面,需要掌握HTML的语句了,通过调整各项数值就可以制作出排版漂亮的页面,跟着就可以学习一些可视化设计软件。下面介绍网页设计如何自学,希望可以帮助到各位。Dre...
- 1、数值类型(数值类型有)
-
1.1数据类型概览MySQL的数据类型可划分为三大类别:数值类型:旨在存储数字(涵盖整型、浮点型、DECIMAL等)。字符串类型:主要用于存储文本(诸如CHAR、VARCHAR之类)。日期/...
- 网页设计的布局属性(网页设计的布局属性是什么)
-
布局属性是网站设计中必不可少的一个重要的环节,主要用来设置网页的元素的布局,主要有以下属性。1、float:该属性设置元素的浮动方式,可以取none,left和right等3个值,分别表示不浮动,浮在...
- Grid网格布局一种更灵活、更强大的二维布局模型!
-
当涉及到网页布局时,display:flex;和display:grid;是两个常用的CSS属性,它们都允许创建不同类型的布局,但有着不同的用法和适用场景。使用flex布局的痛点当我们使...
- React 项目实践——创建一个聊天机器人
-
作者:FredrikStrandOseberg转发链接:https://www.freecodecamp.org/news/how-to-build-a-chatbot-with-react/前言...
- 有趣的 CSS 数学函数(css公式)
-
前言之前一直在玩three.js,接触了很多数学函数,用它们创造过很多特效。于是我思考:能否在CSS中也用上这些数学函数,但发现CSS目前还没有,据说以后的新规范会纳入,估计也要等很久。然...
- web开发之-前端css(5)(css前端设计)
-
显示控制一个元素的显示方式,我们可以使用display:block;display:inline-block;display:none;其中布局相关的还有两个很重要的属性:display:flex;和...
- 2024最新升级–前端内功修炼 5大主流布局系统进阶(分享)
-
获课:keyouit.xyz/14642/1.前端布局的重要性及发展历程前端布局是网页设计和开发的核心技能之一,它决定了页面元素如何组织和呈现。从早期的静态布局到现代的响应式布局,前端布局技术经历了...
- 教你轻松制作自动换行的CSS布局,轻松应对不同设备!
-
在网页设计中,自动换行的CSS布局是非常常见的需求,特别是在响应式设计中。它可以让网页内容自动适应不同屏幕尺寸,保证用户在不同设备上都能够获得良好的浏览体验。本文将介绍几种制作自动换行的CSS布局的方...
- 晨光微语!一道 CSS 面试题,伴你静享知识治愈时光
-
当第一缕阳光温柔地爬上窗台,窗外的鸟鸣声清脆悦耳,空气中弥漫着清新的气息。在这宁静美好的清晨与上午时光,泡一杯热气腾腾的咖啡,找一个舒适的角落坐下。前端的小伙伴们,先把工作的疲惫和面试的焦虑放在一边,...
- 2023 年的响应式设计指南(什么是响应式设计优缺点)
-
大家好,我是Echa。如今,当大家考虑构建流畅的布局时,没有再写固定宽度和高度数值了。相反,小编今天构建的布局需要适用于几乎任何尺寸的设备。是不是不可思议,小编仍然看到网站遵循自适应设计模式,其中它有...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML常用标签 (29)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- CSS 水平对齐 (Horizontal Align) (30)