作者 | mokeyWie

来源 | http://r6a.cn/efZ2

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>

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进行报文的加密通讯,改造如下:

如何使用GitHub Action自动发布JAR到Maven仓库

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

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

Redis 高负载排查记录

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

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

2. HTTPS 协议

2.1 HTTPS 简介

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

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

90%的开发都不太考虑这个,但只要出问题直接公司完蛋!

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

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

2.2 CA 认证体系

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

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

  • 签发证书

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

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

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

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

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

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

总结

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

往期推荐

涨姿势:另类的表情域名赚钱大法!!

90%的开发都不太考虑这个,但只要出问题直接公司完蛋!

MySQL主从原理,基于快速学习一门技术的3种方式!

一起学习下一线大厂的分布式唯一ID生成方案!

分库分表这样玩,可以永不迁移数据、避免热点

如果你喜欢本文,欢迎关注我,订阅更多精彩内容

关注我回复「加群」,加入Spring技术交流群

免费领取:算法刷题笔记

喜欢的这里报道

↘↘↘

面试官:为什么HTTPS是安全的?相关推荐

  1. 面试官系列 - https 真的安全吗,可以抓包吗,如何防止抓包吗

    文章目录 前言 背景 什么是 https 什么是SSL https 的连接过程 证书验证阶段 数据传输阶段 https 的加密方式是怎样的,对称加密和非对称加密,为什么要这样设计 内容传输为什么要使用 ...

  2. 面试官:HTTPS 为什么是安全的?说一下他的底层实现原理?

    作者 | leapmie 来源 | urlify.cn/zQj6f2 这篇干货不错,把HTTPS的原理讲清楚了,而且容易懂,建议大家好好读一下. # HTTPS 随着 HTTPS 建站的成本下降,现在 ...

  3. 《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

    前言 我被Hr领进了一个小黑屋,让我在这里等面试官,过来一会,一位穿着拖鞋的中年男子走了进来,看着他绝顶聪明的发际线,知道这肯定是位大佬,我心里倍感到了压力: 面试官果然不是盖的,刚坐下后就开始立即暴 ...

  4. 面试官系列- 你真的了解 http 吗

    文章目录 往期文章 面试常见 一道经典的面试题 http 必备基础知识 什么是无状态协议,HTTP 是无状态协议吗,怎么解决 几种方法 http get 和 post 区别 http put 和 po ...

  5. 最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官

    Redis的zset实现延时任务 设计题:如何设计tiny url 为什么要四次挥手 HTTPS - - 第二天收到hr小姐姐的电话,约了面试时间 二面(项目+Redis+MySQL+kafka) 自 ...

  6. 某面试官吐槽:面试某大龄程序员,问HTTPS的加密过程,对方却答不出来!网友:这个问题毫无意义!...

    大龄程序员面试时会遭遇什么窘境? 一个面试官发帖吐槽:刚才面了一个毕业15年的开发,自己并没有要坑大龄程序员的意思,只是问了一个https的加密过程,结果那个大龄程序员支支吾吾没答出关键,真怕自己以后 ...

  7. https开头的网址是什么意思_我想打这个面试官,他给我挖坑,问我:URI中的 “//” 有什么用?...

    我们在浏览网页的时候,需要在浏览器中输入http://或者https://开头的URL地址,类似http://honeypps.com,那么这里的"://"或者"//&q ...

  8. 面试官的几句话,差点让我挂在HTTPS上

    作为软件测试,大家都知道一些常用的网络协议是我们必须要了解和掌握的,比如 HTTP 协议,HTTPS 协议就是两个使用非常广泛的协议,所以也是面试官问的面试的时候问的比较多的两个协议:而且因为这两个协 ...

  9. 从面试官角度观察到的程序员工资瓶颈,同时给出突破瓶颈的建议

    原文链接: https://gitbook.cn/books/5d98575e0f43867cba9d84a0/index.html 我在做技术面试官的时候,大多数面试的是初级开发和高级开发,偶尔也会 ...

  10. java录排名怎么写_面试官:Java排名靠前的工具类你都用过哪些?

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 推荐:https://www.xttblog.com/?p=5158 在Java ...

最新文章

  1. ORA-02291: 违反完整约束条件 - 未找到父项关键字 解决方法
  2. 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )
  3. 推荐一款ui架构--frozenui
  4. qt linux opensource ,QT opensource embedded linux 编…
  5. studio 快捷键
  6. Bootstrap 滚动监听插件Scrollspy 的选项
  7. Neo4j HA环境配置
  8. windows 画图工具 —— mspaint 的使用
  9. Vimtutor中文版
  10. iOS学习笔记——多控制器管理
  11. 【大话Mysql面试】-Mysql常见面试题目
  12. 效率起飞?时下流行Sketch插件谁更“香”
  13. 51单片机入门——LED灯
  14. java基础 day12-FileInputStream类,文件的复制,缓冲流,Propertes文件,xml文件读写,网络socket编程(构建TCP客户端),内部类
  15. 资金流入流出预测—————第四部分
  16. android shell打包报错
  17. .NET中Hangfire快速入门和使用-迷恋自留地
  18. 四川麻将必胜攻略笔记(入门篇1)
  19. QtCreator报错 LNK1104:无法打开文件debug\.obj
  20. 115200波特率-串口基本知识

热门文章

  1. 删除Win7隐藏的系统分区
  2. 用二维编码做特色名片!
  3. 注册CSDN帐号的见闻续
  4. spring MVC之返回JSON数据(Spring3.0 MVC+Jackson+AJAX)
  5. golang 结构体struct 标签tag 标记 `` 简介
  6. python3 with中异常的问题
  7. python3 selenium 无头浏览器 错误 FileNotFoundError: [Errno 2] No such file or directory: 'geckodriver'
  8. metasploit msfvenom使用实例
  9. linux screen 命令详解(后台执行linux命令)
  10. linux下kill命令小结