来源:segmentfault.com/a/1190000023936425
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.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.36wd=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: 被中间人停止攻击,内容修改为我爱PHP 小明被群嘲(手动狗头)能够看到在 HTTP 传输过程中,中间人能看到而且修改 HTTP 通信中所有的恳求和响应内容,所以利用 HTTP 长短常的不平安的。
1.3 避免中间人攻击那个时候可能就有人想到了,既然内容是明文那我利用对称加密的体例将报文加密如许中间人不就看不到明文了吗,于是如下革新:
两边约定加密体例 利用 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协议上,还在应用在各类应用层协议上,例如:FTP、WebSocket。
其实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 有个更深入的领会。
近期热文保举:
1.1,000+ 道 Java面试题及谜底整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,尝尝粉饰器形式,那才是文雅的体例!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!



















还没有评论,来说两句吧...