1. HTTP 协议

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

1.1 HTTP 协议介绍

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

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

  • 请求
POST http://www.baidu.com HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Content-Length: 7
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36wd=HTTP
  • 响应
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Thu, 14 Feb 2019 07:23:49 GMT
Transfer-Encoding: chunked<html>...</html>

<!--more-->

1.2 HTTP 中间人攻击

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

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

  1. 小明在 JAVA 贴吧发帖,内容为我爱JAVA
  2. 被中间人进行攻击,内容修改为我爱PHP
  3. 小明被群嘲(手动狗头)

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

1.3 防止中间人攻击

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

  1. 双方约定加密方式
  2. 使用 AES 加密报文

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

那么对于这种情况,我们肯定就会考虑能不能将秘钥进行加密不让中间人看到呢?答案是有的,采用非对称加密,我们可以通过 RSA 算法来实现。

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

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

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

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

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

2. HTTPS 协议

2.1 HTTPS 简介

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

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

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

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

2.2 CA 认证体系

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

整个CA使用过程如下:参考https://www.cnblogs.com/xdyixia/p/11610102.html

CA的过程就是依赖三类基本算法:散列(哈希)函数 Hash、对称加密和非对称加密。其中上述过程中Hash()函数就是类似MD5的散列函数(不可逆)

  • 权威认证机构
    在 CA 认证体系中,所有的证书都是由权威机构来颁发,而权威机构的 CA 证书都是已经在操作系统中内置的,我们把这些证书称之为CA根证书
  • 签发证书
    我们的应用服务器如果想要使用 SSL 的话,需要通过权威认证机构来签发CA证书,我们将服务器生成的公钥和站点相关信息发送给CA签发机构,再由CA签发机构通过服务器发送的相关信息用CA签发机构进行加签,由此得到我们应用服务器的证书,证书会对应的生成证书内容的签名,并将该签名使用CA签发机构的私钥进行加密得到证书指纹,并且与上级证书生成关系链。

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


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

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

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

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

HTTPS怎么避免中间人攻击相关推荐

  1. 清晰图解https如何防范中间人攻击

    https/tls原理 HTTPS访问的三个阶段 第一阶段 认证站点 客户端向站点发起HTTPS请求,站点返回数字证书.客户端通过数字证书验证所访问的站点是真实的目标站点. 第二阶段 协商密钥 客户端 ...

  2. HTTPS 原理及中间人攻击

    随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上 HTTPS 协议.大家都知道 HTTPS 比 HTTP 安全,也听说过与 HTTPS 协议相关的概念有 SSL .非对称加密. CA证 ...

  3. HTTPS如何防止中间人攻击

    首先服务器需要向数字认证机构(以下简称CA)申请证书,比如现在服务器想发布一个网站www.abc.com(以下简称abc),服务器生成公开密钥算法的一对密钥,比如RSA密钥.服务器会先生成一个证书签名 ...

  4. HTTPS中间人攻击,HTTPS被抓包了怎么办?

    目录 一.写在前面 二.什么是中间人攻击 三.https 是绝对安全的吗 四.中间人攻击的初步了解 五.中间人攻击的深入了解 六.https 是如何防止中间人攻击的 SSL-Pinning 七.浏览器 ...

  5. 老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:leapmie 来源:https://urlify.cn/z ...

  6. (多图)老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗...

    HTTPS 随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上 HTTPS 协议.大家都知道 HTTPS 比 HTTP 安全,也听说过与 HTTPS 协议相关的概念有 SSL .非对称加 ...

  7. HTTPS中间人攻击实践(原理·实践)

    前言 很早以前看过HTTPS的介绍,并了解过TLS的相关细节,也相信使用HTTPS是相对安全可靠的.直到前段时间在验证https代理通道连接时,搭建了MITM环境,才发现事实并不是我想的那样.由于部分 ...

  8. 客户端访问https时应无浏览器(含终端)安全警告信息;_(多图)老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗......

    HTTPS HTTPS 的实现原理 为什么数据传输是用对称加密? 为什么需要 CA 认证机构颁发证书? 浏览器是如何确保 CA 证书的合法性? 本地随机数被窃取怎么办? 用了 HTTPS 会被抓包吗? ...

  9. 你连HTTPS 原理都不懂,还给我讲“中间人攻击”

    这篇干货不错,把HTTPS的原理讲清楚了,而且容易懂,建议大家好好读一下. HTTPS 随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上 HTTPS 协议.大家都知道 HTTPS 比 ...

最新文章

  1. IEEE signal processing letters 投稿经验
  2. springboot filter and interceptor实战之mdc日志打印
  3. 如何通过在ViewPager中用手指轻扫来禁用分页,但是仍然能够以编程方式轻扫?
  4. 文巾解题 面试题 17.10. 主要元素
  5. Vim 4 常用插件
  6. Redis的常用功能
  7. 清华大学《操作系统》(十二):临界区与锁
  8. C 语言 函数调用栈
  9. 外星人到底在哪?普利茅斯大学新建AI寻系外生命系统
  10. Vue.js(8)- 父组件给子组件传值
  11. IOS开发之-人脸识别
  12. AspUpload中文手册及语法
  13. 作业指导书分析怎么做?制作作业指导书分析的软件有哪些?
  14. 房产管理系统平台平台管理分析
  15. 工作室SWS自动化脚本
  16. Oracle 快速入门 同义词序列视图索引
  17. JAVA我的世界突然没声音_我的世界电脑版没声音怎么办
  18. 关于c语言中 scanf 对多行字符的输入问题
  19. python——字符串练习:句子反转
  20. K-Means算法的收敛性和如何快速收敛超大的KMeans?

热门文章

  1. 吉里吉里2 2.28 rev3发布
  2. 微信退款服务器系统失败怎么办,做微信退款,但时不时会退款失败,各位帮忙看看...
  3. c语言计次循环首,【图片】今天写几个性能测试,为什么C语言跑得这么慢呢??【c语言吧】_百度贴吧...
  4. python实现最小堆
  5. 项目的行政收尾工作主要有哪些
  6. 【运维面试】校企合作运维工程师12-16K薪资面试题
  7. 看华为eLTE-IoT如何联接高效工业物联网
  8. 软件试用期的实现原理
  9. axios二次封装以及API接口统一管理
  10. 【经典】springboot 配置文件统一管理