近年来,互联网发生了翻天覆地的变化,尤其是我们习以为常的HTTP协议正在逐渐被HTTPS协议取代,那么为什么要使用HTTPS呢?因为HTTP不安全!图片来自PexelsHTTP协议浅谈HTTPS在协议之前,我们先来回顾一下HTTP协议的概念。HTTP协议简介HTTP协议是一种基于文本的传输协议,在OSI网络模型中驻留在应用层。HTTP协议通过客户端和服务器之间的请求响应进行通信。目前的协议从之前的RFC2616拆分为六个独立的协议描述(RFC7230、RFC7231、RFC7232、RFC7233、RFC7234、RFC7235),通信报文如下:Request:POSThttp://www.baidu.comHTTP/1.1Host:www.baidu.comConnection:keep-aliveContent-Length:7User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/71.0.3578.98Safari/537.36wd=HTTP响应:HTTP/1.1200OKConnection:Keep-AliveContent-Encoding:gzipContent-Type:text/html;charset=utf-8Date:Thu,14Feb201907:23:49GMTTransfer-Encoding:chunked...HTTP中间人攻击HTTP协议使用起来确实非常方便,但是它有一个致命的缺点:不安全。我们知道HTTP协议中的报文是明文传输的,没有经过任何加密。这会造成什么问题?举个例子:①小明在Java贴吧发帖,内容是我爱java:②被中间人攻击,内容修改为我爱PHP:③小明被嘲讽团(手动狗头)。可以看到在HTTP传输过程中,中间人可以看到和修改HTTP通信中所有的请求和响应内容,所以使用HTTP非常重要。不安全。防止中间人攻击,这时候可能有人想到了。由于内容是明文,所以我使用对称加密来加密消息,中间人看不到明文。所以改造如下:①双方约定加密方式,如下图:②使用AES加密报文,如下图:实际上加密方式和秘钥在通信过程中会以明文的形式暴露出来。如果第一次通信被拦截,那么秘钥就会泄露给中间人,中间人仍然可以解密后面的通信,如下图所示:所以这种情况下,我们肯定会考虑秘钥是否可以被破解加密不让中介看到?答案是肯定的,使用非对称加密,我们可以使用RSA算法来实现。约定加密方式时,服务器生成一对公私钥,服务器将公钥返回给客户端,客户端在本地生成一串秘钥(AES_KEY)进行对称加密,并用获取服务器发送的公钥(AES_KEY_SECRET),然后返回给服务器。服务器使用私钥解密客户端发送的AES_KEY_SECRET得到AEK_KEY,最后客户端和服务器使用AEK_KEY加密消息。变换如下图所示:可以看出,在这种情况下,中间人无法窃取AES加密所用的秘钥,那么后续通信肯定无法解密。这样做绝对安全吗?所谓道高一尺,魔高一尺,中间人想出了新的破解方案来对应这种加密方式。由于拿不到AES_KEY,我把自己模拟成客户端和服务器的组合。在用户→中介的过程中,中间人模拟服务器的行为,从而得到用户请求的明文,在中介→服务器的过程中,中介模拟行为客户端,从而可以得到服务器响应的明文,从而进行中间人攻击:这次通信又被中介拦截了。中介还伪造了一对公私钥,并将公钥发送给用户,以窃取客户端生成的AES_KEY。拿到AES_KEY后,就可以轻松解密了。有没有办法制裁中介为所欲为?当然有。接下来我们看看HTTPS是如何解决通信安全问题的。HTTPS协议简介HTTPSHTTPS其实就是SSL+HTTP的缩写。当然,SSL已经基本被TLS取代,但我们还是会使用SSL作为简称。事实上,SSL协议不仅适用于HTTP协议,还适用于各种应用层协议,如FTP、WebSocket等。其实SSL协议和上一节的非对称加密大致相同。握手的主要目的是交换秘钥,然后在通信过程中使用对称加密进行通信。大致流程如下:我这里只是画了示意图。其实真正的SSL握手要比这复杂的多,但是本质还是一样的。这里需要重点关注的是HTTPS如何防止中间人攻击。从上图可以看出,服务端通过SSL证书传递公钥,客户端会验证SSL证书。证书认证体系是保障SSL安全的关键。接下来,我们就来讲解一下CA认证体系,看看它是如何防止中间人攻击的。在上一节CA认证系统中,我们看到客户端需要验证服务器返回的SSL证书,那么客户端如何验证服务器的SSL证书的安全性。权威的证书颁发机构在CA认证体系中,所有的证书都是由权威机构颁发的,权威机构的CA证书已经内置到操作系统中。我们称这些证书为CA根证书:颁发证书我们应用服务器的应用服务器如果要使用SSL,需要通过权威的证书颁发机构颁发CA证书。我们将服务器生成的公钥和站点相关信息发送给CA发证机构,然后CA发证机构通过服务器发送的相关信息使用CA证书。发证机构加签。这样就得到了我们应用服务器的证书,证书会对应生成证书内容的签名,并用CA颁发机构的私钥对签名进行加密得到证书指纹,并生成与上级的关系链证书。这里我们下载百度的证书看看:可以看到百度是受GlobalSignG2信任的,而GlobalSignG2也是受GlobalSignR1信任的。当客户端(浏览器)检查证书时,会逐级检查,直到最终的根证书。如果没有问题,说明服务器证书可以信任。如何验证服务器证书那么客户端(浏览器)如何验证服务器证书呢?首先会通过层次关系找到上级证书,并通过上级证书中的公钥解密服务器的证书指纹得到签名(sign1),然后通过签名计算出服务器证书的签名(sign2)算法。通过比较sign1和sign2,如果相等,说明证书没有被篡改或伪造。这里有意思的是,用于证书校验的RSA通过私钥加密证书签名,公钥解密,巧妙地验证了证书的有效性。这样,通过证书认证系统,我们就可以防止中间人窃取AES_KEY发起对HTTP通信报文的拦截和修改。总结首先通过HTTP中间人攻击来理解HTTP为什么不安全,然后从安全攻防的技术演进到HTTPS原理的概括,希望大家能够有一个对HTTPS的理解更深。作者:MonkeyWie编辑:陶家龙来源:https://juejin.im/post/6870015164373008398
