小明看看加密地址一 记住看小电影前一定要检查网址是不是 HTTPS 的,不然…
来自:分段故障,作者:莫克威
1、HTTP 协议在谈论HTTPS协议之前,让我们回顾一下HTTP协议的概念。
1.1 http协议介绍
HTTP协议是一种基于文本的传输协议,位于OSI网络模型的应用层。
HTTP协议通过客户端和服务器的请求响应进行通信。目前,协议被RFC 2616分为六个独立的协议规范。通信消息如下:
请求
POSThttp://www.baidu.comHTTP/1.1Host: www.baidu.comConnection: keep-aliveContent-Length: 7User-Agent: Mozilla/5.0 AppleWebKit/537.36 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& lthtml>。...& lt/html>。
1.2 HTTP中间人攻击
HTTP协议使用起来非常方便,但是有一个致命的缺点:不安全。
我们知道HTTP协议中的消息是以明文传输的,没有任何加密。这会导致什么问题?这里有一个例子:
小明在JAVA贴吧发帖,内容是我爱JAVA:
被中间人攻击,内容改成了我爱PHP
小明被小组嘲笑了
可以看出,在HTTP传输过程中,中间人可以看到并修改HTTP通信中的所有请求和响应,因此使用HTTP是非常不安全的。
1.3防止中间人攻击
这时,可能有人会想到,既然内容是明文,我就用对称加密对消息进行加密,这样中间人就看不到明文了,于是做了如下的变换:
双方约定的加密方式
使用AES加密邮件
看似中间人无法获取明文信息,但实际上,在通信过程中加密方式和密钥仍会以明文形式暴露。如果第一次通信被拦截,密钥会泄露给中间人,中间人仍然可以解密后续通信:
所以在这种情况下,我们肯定会考虑是否可以加密密钥,让中间人看不到。答案是肯定的,使用非对称加密,我们可以通过RSA算法来实现。这一步的实际操作也比较简单。你可以通过在编码员的笔记订阅号背景下回复HTTPS来观看建立HTTPS服务的视频。
当同意加密方法时,服务器生成一对公钥和私钥,服务器将公钥返回给客户端。客户端在本地生成一系列用于对称加密的密钥,通过服务器发送的公钥进行加密,得到,然后返回给服务器。服务器通过私钥对客户端发送的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认证体系
在上一节中,我们看到客户端需要验证服务器返回的SSL证书,那么客户端如何验证服务器SSL证书的安全性呢?
权威认证机构
在CA认证体系中,所有的证书都是权威机构颁发的,操作系统中已经内置了权威机构的CA证书。我们将这些证书称为CA根证书:
颁发证书
如果我们的应用服务器想要使用SSL,就需要通过权威的认证机构颁发CA证书。我们将服务器生成的公钥和站点相关信息发送给CA颁发机构,然后CA颁发机构通过服务器发送的相关信息由CA颁发机构签名,从而获得我们应用服务器的证书。证书会对应生成证书内容的签名,用CA颁发机构的私钥对签名进行加密得到证书指纹,并生成与上级证书的关系链。
下面我们下载百度的证书看看:
可见,百度是受GlobalSign G2信任的,同样的GlobalSign G2也是受GlobalSign R1信任的。当客户端检查证书时,它将逐级检查它,直到最终的根证书。如果没有问题,可以信任服务器证书。
如何验证服务器证书
那么客户端如何检查服务器证书呢?首先,它会通过层次关系找到上级证书,通过上级证书中的公钥解密服务器证书的指纹得到签名,然后通过签名算法计算服务器证书的签名。通过比较符号1和符号2,如果它们相等,则表示证书没有被篡改或伪造。
这里有趣的是,证书验证中使用的RSA通过用私钥加密证书签名,用公钥解密,巧妙地验证了证书的有效性。
这样,通过证书的认证系统,可以避免中间人窃取AES_KEY发起对HTTP通信消息的拦截和修改。
摘要
首先通过攻击HTTP中间人知道HTTP为什么不安全,然后从安全攻防技术进化到HTTPS的原理概括,希望能对HTTPS有更深的了解。