面试官:为什么HTTPS是安全的?
作者 | 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 协议中的报文都是以明文的方式进行传输,不做任何加密,这样会导致什么问题呢?下面来举个例子:
小明在 JAVA 贴吧发帖,内容为
我爱JAVA
:被中间人进行攻击,内容修改为
我爱PHP
小明被群嘲(手动狗头)
可以看到在 HTTP 传输过程中,中间人能看到并且修改 HTTP 通讯中所有的请求和响应内容,所以使用 HTTP 是非常的不安全的。
1.3 防止中间人攻击
这个时候可能就有人想到了,既然内容是明文那我使用对称加密
的方式将报文加密这样中间人不就看不到明文了吗,于是如下改造:
双方约定加密方式
使用 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
协议上,还在应用在各种应用层协议上,例如:FTP
、WebSocket
。
其实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)
,通过对比sign1
和sign2
,如果相等就说明证书是没有被篡改
也不是伪造
的。这里有趣的是,证书校验用的 RSA 是通过私钥加密证书签名,公钥解密来巧妙的验证证书有效性。
这样通过证书的认证体系,我们就可以避免了中间人窃取AES_KEY
从而发起拦截和修改 HTTP 通讯的报文。
总结
首先先通过对 HTTP 中间人攻击的来了解到 HTTP 为什么是不安全的,然后再从安全攻防的技术演变一直到 HTTPS 的原理概括,希望能让大家对 HTTPS 有个更深刻的了解。
往期推荐
涨姿势:另类的表情域名赚钱大法!!
90%的开发都不太考虑这个,但只要出问题直接公司完蛋!
MySQL主从原理,基于快速学习一门技术的3种方式!
一起学习下一线大厂的分布式唯一ID生成方案!
分库分表这样玩,可以永不迁移数据、避免热点
如果你喜欢本文,欢迎关注我,订阅更多精彩内容
关注我回复「加群」,加入Spring技术交流群
免费领取:算法刷题笔记
喜欢的这里报道
↘↘↘
面试官:为什么HTTPS是安全的?相关推荐
- 面试官系列 - https 真的安全吗,可以抓包吗,如何防止抓包吗
文章目录 前言 背景 什么是 https 什么是SSL https 的连接过程 证书验证阶段 数据传输阶段 https 的加密方式是怎样的,对称加密和非对称加密,为什么要这样设计 内容传输为什么要使用 ...
- 面试官:HTTPS 为什么是安全的?说一下他的底层实现原理?
作者 | leapmie 来源 | urlify.cn/zQj6f2 这篇干货不错,把HTTPS的原理讲清楚了,而且容易懂,建议大家好好读一下. # HTTPS 随着 HTTPS 建站的成本下降,现在 ...
- 《面试官不讲武德》对Java初级程序猿死命摩擦Http协议
前言 我被Hr领进了一个小黑屋,让我在这里等面试官,过来一会,一位穿着拖鞋的中年男子走了进来,看着他绝顶聪明的发际线,知道这肯定是位大佬,我心里倍感到了压力: 面试官果然不是盖的,刚坐下后就开始立即暴 ...
- 面试官系列- 你真的了解 http 吗
文章目录 往期文章 面试常见 一道经典的面试题 http 必备基础知识 什么是无状态协议,HTTP 是无状态协议吗,怎么解决 几种方法 http get 和 post 区别 http put 和 po ...
- 最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官
Redis的zset实现延时任务 设计题:如何设计tiny url 为什么要四次挥手 HTTPS - - 第二天收到hr小姐姐的电话,约了面试时间 二面(项目+Redis+MySQL+kafka) 自 ...
- 某面试官吐槽:面试某大龄程序员,问HTTPS的加密过程,对方却答不出来!网友:这个问题毫无意义!...
大龄程序员面试时会遭遇什么窘境? 一个面试官发帖吐槽:刚才面了一个毕业15年的开发,自己并没有要坑大龄程序员的意思,只是问了一个https的加密过程,结果那个大龄程序员支支吾吾没答出关键,真怕自己以后 ...
- https开头的网址是什么意思_我想打这个面试官,他给我挖坑,问我:URI中的 “//” 有什么用?...
我们在浏览网页的时候,需要在浏览器中输入http://或者https://开头的URL地址,类似http://honeypps.com,那么这里的"://"或者"//&q ...
- 面试官的几句话,差点让我挂在HTTPS上
作为软件测试,大家都知道一些常用的网络协议是我们必须要了解和掌握的,比如 HTTP 协议,HTTPS 协议就是两个使用非常广泛的协议,所以也是面试官问的面试的时候问的比较多的两个协议:而且因为这两个协 ...
- 从面试官角度观察到的程序员工资瓶颈,同时给出突破瓶颈的建议
原文链接: https://gitbook.cn/books/5d98575e0f43867cba9d84a0/index.html 我在做技术面试官的时候,大多数面试的是初级开发和高级开发,偶尔也会 ...
- java录排名怎么写_面试官:Java排名靠前的工具类你都用过哪些?
你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 推荐:https://www.xttblog.com/?p=5158 在Java ...
最新文章
- ORA-02291: 违反完整约束条件 - 未找到父项关键字 解决方法
- 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )
- 推荐一款ui架构--frozenui
- qt linux opensource ,QT opensource embedded linux 编…
- studio 快捷键
- Bootstrap 滚动监听插件Scrollspy 的选项
- Neo4j HA环境配置
- windows 画图工具 —— mspaint 的使用
- Vimtutor中文版
- iOS学习笔记——多控制器管理
- 【大话Mysql面试】-Mysql常见面试题目
- 效率起飞?时下流行Sketch插件谁更“香”
- 51单片机入门——LED灯
- java基础 day12-FileInputStream类,文件的复制,缓冲流,Propertes文件,xml文件读写,网络socket编程(构建TCP客户端),内部类
- 资金流入流出预测—————第四部分
- android shell打包报错
- .NET中Hangfire快速入门和使用-迷恋自留地
- 四川麻将必胜攻略笔记(入门篇1)
- QtCreator报错 LNK1104:无法打开文件debug\.obj
- 115200波特率-串口基本知识
热门文章
- 删除Win7隐藏的系统分区
- 用二维编码做特色名片!
- 注册CSDN帐号的见闻续
- spring MVC之返回JSON数据(Spring3.0 MVC+Jackson+AJAX)
- golang 结构体struct 标签tag 标记 `` 简介
- python3 with中异常的问题
- python3 selenium 无头浏览器 错误 FileNotFoundError: [Errno 2] No such file or directory: 'geckodriver'
- metasploit msfvenom使用实例
- linux screen 命令详解(后台执行linux命令)
- linux下kill命令小结