乐趣区

关于java:干坏事前一定要检查自己的域名是不是-HTTPS-的不然……

一、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.36

wd=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 算法来实现。这个步骤实际操作也是比较简单的,在码匠笔记订阅号后盾回复 HTTPS 就能够查看搭建 HTTPS 服务视频。

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

能够看到这种状况下中间人是窃取不到用于 AES 加密的秘钥,所以对于后续的通信是必定无奈进行解密了,那么这样做就是相对平安了吗?

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

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

中间人这样随心所欲,就没有方法制裁下吗,当然有啊,接下来咱们看看 HTTPS 是怎么解决通信平安问题的。

二、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 有个更粗浅的理解。

写在最初

欢送大家关注我的公众号【惊涛骇浪如码】,海量 Java 相干文章,学习材料都会在外面更新,整顿的材料也会放在外面。

感觉写的还不错的就点个赞,加个关注呗!点关注,不迷路,继续更新!!!

退出移动版