记住看小电影前一定要检查网址是不是 HTTPS 的,不然…
看小电影还是看常规网站,一定要检查是否是HTTPS。 HTTP可能被中间人攻击或拦截。 以下是详细的HTTPS原理,仔细想想很可怕
1. HTTP协议
在谈HTTPS协议之前,让我们回顾一下HTTP协议的概念。
1.1 HTTP协议介绍HTTP协议是一种基于文本的传输协议,位于OSI网络模型中的APP应用层。
HTTP协议通过服务器请求与客户端的响应进行通信,其中,当前协议被以前的RFC 2616拆分成六个单独的协议描述符(RFC 7230、RFC 7231、RFC 7232、RFC 7233、RFC 7233 ) 通信信息如下。
请求
post http://www.Baidu.com http/1.1 host : www.Baidu.com connection 3360 keep-alive content-length 33607 user-agent 33330 ww x64 ) appleWebKit/537.36(khtml,like Gecko ) chrome/71.0.3578.98 safari/537.36 wd=http
应答
HTP/1.1200 ok连接3360 keep-alive content-encoding : gzip content-type : text/html; charset=utf-8Date: Thu,14 feb 20190733602336049 GMT transfer-encoding : chunked .
1.2 HTTP中间人攻击HTTP协议确实易于使用,但具有不安全的致命缺点。
我知道所有HTTP协议的消息都是明文传输的,不进行加密,那会引起什么问题呢? 举个例子:
无知的花瓣发布在JAVA论坛上,内容是我爱JAVA :
被中间人攻击,内容被修改为爱PHP
无知的花瓣被群嘲笑
使用HTTP是不安全的,因为在HTTP传输期间,中间人可以查看和修改HTTP通信中的所有请求和响应。
1.3防止中间人攻击的时候,可能有人想到了。 既然内容是明文,那么如果使用对称加密方法加密邮件,中介会不会看不到明文? 因此,改造如下。
双方约定加密方式
使用AES加密邮件
这样看起来好像中间人无法获得明文信息,但实际上在通信过程中加密方式和私钥会以明文形式公开。 如果第一次通信被监听,私钥会泄露给中介,中介可以解密后续通信。
在这种情况下,我们一定在想,能否将私钥加密,不让中间人看到。 有答案。 可以采用非对称加密,用RSA算法实现。 这个步骤实际操作也比较简单。
当约定了加密方案时,服务器生成公钥对,服务器向客户端返回公钥,客户端本地生成用于对称加密的一系列私钥AES_KEY,并使用从服务器发送的公钥加密得到的[ AES _ key _ seey ]
在这种情况下,您可以看到中介无法窃取用于AES加密的私钥,因此无法对后续通信进行解密,这是绝对安全的吗?
道高一尺魔高一丈是中介为了应对这种加密方法而想出新的解密方案,既然拿不到AES_KEY,我就模拟自己作为客户端和服务器端的结合体,在用户-中介的过程中中介模拟服务器的动作中介者-在服务器过程中,中介者可以通过模拟客户端的行为,获得服务器响应的明文并进行中介
这次通信再次被中介拦截,中介自身也通过伪造公钥对,将公钥发送给用户,窃取客户端生成的AES_KEY,得到AES_KEY后可以轻松解密。
如果中间人这样希望,就不能进行制裁吗? 当然有哦。 接下来,让我们来看看HTTPS是如何解决通信安全问题的。
2. HTTPS协议2.1 HTTPS概述HTTPS其实是SSL HTTP的简称,当然目前SSL已基本取代TLS,其次统一SSL为简称。 SSL协议实际上不仅应用于HTTP协议,还应用于FTP、WebSocket等各种APP应用层协议。
实际上,SSL协议与上一节中不对称加密的性质相同,握手过程中也主要是
了交换秘钥,然后再通讯过程中使用对称加密进行通讯,大概流程如下:这里我只是画了个示意图,其实真正的 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 有个更深刻的了解。
来自:https://segmentfault.com/a/1190000023936425
作者:mokeyWie
················· END ·················
长按进入小程序,进行打卡签到新一期打卡签到,奖品超多(更多精彩值得期待……)最近热文:一周内被程序员疯转5.6W次,最终被大厂封杀!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!再见,收费的Teamviewer!!!知乎陶醉的龙猫:拼多多和国家电网,选哪个?解决Github访问速度慢以及图片加载慢的问题LeetCode1-220题汇总,希望对你有点帮助!2T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,人工智能,考研,软考,英语,等等。在公众号内回复「资源」,即可免费获取!回复「社群」,可以邀请你加入读者群!❤️给个「在看」,是对我最大的支持❤️