记住看小电影前一定要检查一下域名是不是 HTTPS 的,不然……

news/2024/7/12 2:49:03 标签: 网络, https, http, ssl, jwt

点击上方蓝色字体,选择“设置星标”

优质文章,第一时间送达

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9vdzZwcnpadVBJRU5iMG01aWF3dXRJZjkwTjJVYjNkY1B1UDJLWEhKdmFSMUZ2MkZuaWNUdU95M0tjSHVJRUpiZDlsVXlPaWJlWHFXOHRFaG9KR0w5OHFPdy82NDA?x-oss-process=image/format,png" />

果哥领读:

‍‍‍‍看小电影还是浏览正常网站,一定要检查是不是 HTTPS 的,HTTP有可能被中间人攻击和拦截,你自己看小电影,没准戈壁的小哥正在拦截你一起看呢?

下面就是详细的 HTTPS 原理,细思极恐。


来自:https>https://segmentfault.com/a/1190000023936425
作者:mokeyWie

1. HTTP 协议
在谈论 HTTPS 协议之前,先来回顾一下 HTTP 协议的概念。

1.1 HTTP 协议介绍

HTTP 协议是一种基于文本的传输协议,它位于 OSI 网络模型中的应用层。

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXQmN0RndqQ2tKSURMSzRXVXFSWUVrSUpTM0tjeXVLaFhhMWlhY1F3QnFuWDVobmo4cGljYVhER1EvNjQw?x-oss-process=image/format,png" />

HTTP 协议是通过客户端和服务器的请求应答来进行通讯,目前协议由之前的 RFC 2616 拆分成立六个单独的协议说明(RFC 7230、RFC 7231、RFC 7232、RFC 7233、RFC 7234、RFC 7235),通讯报文如下:

请求

POST http://www.baidu.com HTTP/1.1Host: www.baidu.comConnection: keep-aliveContent-Length: 7User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
wd=HTTP

响应

HTTP/1.1 200 OKConnection: Keep-AliveContent-Encoding: gzipContent-Type: text/html;charset=utf-8Date: Thu, 14 Feb 2019 07:23:49 GMTTransfer-Encoding: chunked
<html>...</html>

1.2 HTTP 中间人攻击

HTTP 协议使用起来确实非常的方便,但是它存在一个致命的缺点:不安全。

我们知道 HTTP 协议中的报文都是以明文的方式进行传输,不做任何加密,这样会导致什么问题呢?下面来举个例子:

小明在 JAVA 贴吧发帖,内容为我爱JAVA:

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXMkZXSTRCdU16aWNqMGQ0SE1CbzNDc2RkN0FJRzluU2ljUTAzWExIb2FpYlZvQm1NTVUwSHBjMTJRLzY0MA?x-oss-process=image/format,png" />

被中间人进行攻击,内容修改为我爱PHP

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXT09YeVB2bkdROVcweDFlM2VhZHI4eG42Z1ltaWFaTkljMzNTeHZqR2dsdGlhbUFJZWRUcDd0VlEvNjQw?x-oss-process=image/format,png" />

小明被群嘲
可以看到在 HTTP 传输过程中,中间人能看到并且修改 HTTP 通讯中所有的请求和响应内容,所以使用 HTTP 是非常的不安全的。

1.3 防止中间人攻击

这个时候可能就有人想到了,既然内容是明文那我使用对称加密的方式将报文加密这样中间人不就看不到明文了吗,于是如下改造:

双方约定加密方式

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXWlp6UXRpY0NKbkZkZ2U5NGc5ZVdpY2ljckZnYVVZckhVUGUwVnVVWUg0WElKT1lwblRJb1VsSzBnLzY0MA?x-oss-process=image/format,png" />

使用 AES 加密报文

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXODVLY2Z5d1hNSnhwUGRvTTNYR2F5dU9GTGdXZmxyN3hEMGNISnlBN2U3MmljQUhma3hqWEdSUS82NDA?x-oss-process=image/format,png" />

这样看似中间人获取不到明文信息了,但其实在通讯过程中还是会以明文的方式暴露加密方式和秘钥,如果第一次通信被拦截到了,那么秘钥就会泄露给中间人,中间人仍然可以解密后续的通信:

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXaWFFV3RoekpMbGVRUWljN2Z6bmZkaWJhSUllZEp1ZGtDT2xnZm1RazdiZGJiWW5xOVJ4b1FtN2dnLzY0MA?x-oss-process=image/format,png" />

那么对于这种情况,我们肯定就会考虑能不能将秘钥进行加密不让中间人看到呢?答案是有的,采用非对称加密,我们可以通过 RSA 算法来实现。这个步骤实际操作也是比较简单的,在码匠笔记订阅号后台回复HTTPS就可以查看搭建HTTPS服务视频。

在约定加密方式的时候由服务器生成一对公私钥,服务器将公钥返回给客户端,客户端本地生成一串秘钥(AES_KEY)用于对称加密,并通过服务器发送的公钥进行加密得到(AES_KEY_SECRET),之后返回给服务端,服务端通过私钥将客户端发送的AES_KEY_SECRET进行解密得到AEK_KEY,最后客户端和服务器通过AEK_KEY进行报文的加密通讯,改造如下:

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXNDRPN213NWF0cVp3eWliUEg4VnEweGhLa2xzd2RXZHdsZmJ1bzB3eWNNdTJBeVZGcWVYZWJIdy82NDA?x-oss-process=image/format,png" />

可以看到这种情况下中间人是窃取不到用于AES加密的秘钥,所以对于后续的通讯是肯定无法进行解密了,那么这样做就是绝对安全了吗?

所谓道高一尺魔高一丈,中间人为了对应这种加密方法又想出了一个新的破解方案,既然拿不到AES_KEY,那我就把自己模拟成一个客户端和服务器端的结合体,在用户->中间人的过程中中间人模拟服务器的行为,这样可以拿到用户请求的明文,在中间人->服务器的过程中中间人模拟客户端行为,这样可以拿到服务器响应的明文,以此来进行中间人攻击:

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXR0NlTGpCQWRIOFg1aGdIQW54cTB5RmhEeVZ0SXl3TGFOdW9VeDhDMW9pYlRLMjVLenVLU1hJQS82NDA?x-oss-process=image/format,png" />

这一次通信再次被中间人截获,中间人自己也伪造了一对公私钥,并将公钥发送给用户以此来窃取客户端生成的AES_KEY,在拿到AES_KEY之后就能轻松的进行解密了。

中间人这样为所欲为,就没有办法制裁下吗,当然有啊,接下来我们看看 HTTPS 是怎么解决通讯安全问题的。

2. HTTPS 协议

2.1 HTTPS 简介

HTTPS 其实是SSL+HTTP的简称,当然现在SSL基本已经被TLS取代了,不过接下来我们还是统一以SSL作为简称,SSL协议其实不止是应用在HTTP协议上,还在应用在各种应用层协议上,例如:FTP、WebSocket。

其实SSL协议大致就和上一节非对称加密的性质一样,握手的过程中主要也是为了交换秘钥,然后再通讯过程中使用对称加密进行通讯,大概流程如下:

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXTzRqRTFyMjY2UHlBQWVtaGN0TXpvVkh5dkI3NDd3WE1QaWNMZ1dEN2V2b0FBT1c1QWhjTkVCdy82NDA?x-oss-process=image/format,png" />

这里我只是画了个示意图,其实真正的 SSL 握手会比这个复杂的多,但是性质还是差不多,而且我们这里需要关注的重点在于 HTTPS 是如何防止中间人攻击的。

通过上图可以观察到,服务器是通过 SSL 证书来传递公钥,客户端会对 SSL 证书进行验证,其中证书认证体系就是确保SSL安全的关键,接下来我们就来讲解下CA 认证体系,看看它是如何防止中间人攻击的。

2.2 CA 认证体系

上一节我们看到客户端需要对服务器返回的 SSL 证书进行校验,那么客户端是如何校验服务器 SSL 证书的安全性呢。

权威认证机构

在 CA 认证体系中,所有的证书都是由权威机构来颁发,而权威机构的 CA 证书都是已经在操作系统中内置的,我们把这些证书称之为CA根证书:

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXdGZ1STR1WmxpYlJGNGliWlRIbWxBdjBxWWZpYTNBRGU1c1VXM1NuUGZiaWE2RXR6dXJZaWFsZU9WZ3cvNjQw?x-oss-process=image/format,png" />

签发证书

我们的应用服务器如果想要使用 SSL 的话,需要通过权威认证机构来签发CA证书,我们将服务器生成的公钥和站点相关信息发送给CA签发机构,再由CA签发机构通过服务器发送的相关信息用CA签发机构进行加签,由此得到我们应用服务器的证书,证书会对应的生成证书内容的签名,并将该签名使用CA签发机构的私钥进行加密得到证书指纹,并且与上级证书生成关系链。

这里我们把百度的证书下载下来看看:

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXNzdxVDVJSmU3QlE5SnBQelg4V2RydE1aSVVNWjh5aWJRRjBraWJpY2xqSHJhRWFQWDNpY0Q3QzZsdy82NDA?x-oss-process=image/format,png" />

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

如何验证服务器证书

那么客户端(浏览器)又是如何对服务器证书做校验的呢,首先会通过层级关系找到上级证书,通过上级证书里的公钥来对服务器的证书指纹进行解密得到签名(sign1),再通过签名算法算出服务器证书的签名(sign2),通过对比sign1和sign2,如果相等就说明证书是没有被篡改也不是伪造的。

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9RRnpSZHo5bGliRWI3V2ZxclE0aWFKa0VtR1BlN0I2QnlXNWdWWno1SndrRHJLOGJreUhpYWVNaWNQUGljeEFibGdjcGV3TmJaNUlsRWE3eFNYeUVhU3p0aWFjZy82NDA?x-oss-process=image/format,png" />

这里有趣的是,证书校验用的 RSA 是通过私钥加密证书签名,公钥解密来巧妙的验证证书有效性。

这样通过证书的认证体系,我们就可以避免了中间人窃取AES_KEY从而发起拦截和修改 HTTP 通讯的报文。

总结

首先先通过对 HTTP 中间人攻击的来了解到 HTTP 为什么是不安全的,然后再从安全攻防的技术演变一直到 HTTPS 的原理概括,希望能让大家对 HTTPS 有个更深刻的了解。

往期精彩回顾

让人又爱又恨的 Lombok,到底该不该用

Delombok 是个啥?居然可破 Lombok?

跳槽的必要条件是有一份好的简历

时候为自己的后半生考虑了——致奔三的互联网人

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy96b2E2RFhxY3VVaWJMSXNHZDRwajBiN292MVA0NjdQeXNpYUs2SktUREdTRWVpYzVCbGREaWNLbGlib2ZteFVZMVVNNkloSmR3SGljR25mOVV3MEJWQjBHdUFHUS82NDA?x-oss-process=image/format,png" height="1425" width="1279" />

https>https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy96b2E2RFhxY3VVOTRRUGswcnVpYzBPV2Q5eDdOS3p5bWIzTkRvTXlOaWJPNVFhWVBpYmwzclFlMXlZNTI2M1hndFdhZEdVb3BDNWRTa0ZxNW50cUlsZ2ZTQS82NDA?x-oss-process=image/format,png" />

点个赞呗


http://www.niftyadmin.cn/n/1332154.html

相关文章

在网站中使用谷歌“ROBOTO”字体(解决ios数字1和0大小不等宽问题)

在网站中使用谷歌“ROBOTO”字体&#xff08;解决ios数字1和0大小不等宽问题&#xff09; 在开发中发现在mac上数字0和1所占的宽度不一样&#xff0c;网上查询需要用到等宽字体&#xff0c;但是浏览器支持的默认几种等宽字体中文很难看&#xff0c;随即引入谷歌的字体进行渲染。…

还敢乱写代码??腾讯 Code Review 规范出炉!

点击上方蓝色字体&#xff0c;选择“设置星标”优质文章&#xff0c;第一时间送达来源&#xff1a;腾讯技术工程前言作为公司代码委员会 golang 分会的理事&#xff0c;我 review 了很多代码&#xff0c;看了很多别人的 review 评论。发现不少同学 code review 与写出好代码的水…

2020年12月程序员工资统计,平均14222元,Java排名靠后!

点击上方 果汁简历 &#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达2020年12月全国招收程序员394699人。2020年12月全国程序员平均工资14222元&#xff0c;工资中位数12500元&#xff0c;其中96%的人的工资介于3250元到62500元。从图上看&#xff0c;工资是真…

Intellij Idea安装主题包

Intellij Idea安装主题包 一直用默认的主题&#xff0c;但是白色的背景看久了会晃眼睛。所以打算换成黑色的。 不过Intellij只有两种主题&#xff0c;Default和Darcula。 现在只能自己手动安装一个了。新主题需要满足&#xff0c; 看久了不会太累。 肉眼能够很容易识别出error的…

10 分钟使用 Spring Boot + Vue + Antd + US3 搭建自己的图床

点击上方蓝色字体&#xff0c;选择“设置星标”优质文章&#xff0c;第一时间送达网上已经一些运行不错的图床了&#xff0c;比如SM.MS https://sm.ms/图壳 https://imgkr.com路过图床 https://imgchr.com/那为什么我们还要自己搭建图床呢&#xff1f;一来是因为码农总是喜欢折…

nrm – NPM registry manager

nrm – NPM registry manager nrm can help you easy and fast switch between different npm registries, now include: npm, cnpm, taobao, nj(nodejitsu). nrm 能帮助你简单快速的在不同的npmregistries进行切换&#xff0c;包含如下几个registries&#xff0c;npm官方&…

出来打工,不图钱图什么?

大家好&#xff0c;其实我一直不知道我在大家心目中的定位是什么&#xff0c;但我内心其实是把自己定义为一个『工具人』的。可能是因为我自己本身就是程序员&#xff0c;所以更能理解程序员的不易吧。所以&#xff0c;我尽量不写水文&#xff0c;只分享干货。就是希望大家看了…

据说程序员等电梯的时候都想过调度算法,网友:还真是

点击上方 果汁简历 &#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达1.传统电梯调度算法1.1先来先服务算法(FCFS)先来先服务(FCFS-First Come First Serve)算法&#xff0c;是一种随即服务算法&#xff0c;它不仅仅没有对寻找楼层进行优化&#xff0c;也没有实…