当前位置: 首页 > 科技观察

面试官:为什么HTTPS是安全的?

时间:2023-03-22 14:47:09 科技观察

1。HTTP协议在说HTTPS协议之前,我们先来回顾一下HTTP协议的概念。1.1HTTP协议介绍HTTP协议是一种基于文本的传输协议,位于OSI网络模型的应用层。HTTP协议通过客户端和服务器之间的请求响应进行通信。目前的协议从之前的RFC2616拆分为六个独立的协议描述(RFC7230、RFC7231、RFC7232、RFC7233、RFC7234、RFC7235),通信报文如下:请求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...1.2HTTP中间人攻击HTTP协议使用起来确实非常方便,但是它有一个致命的缺点:不安全。我们知道HTTP协议中的报文是明文传输的,没有经过任何加密。这会造成什么问题?举个例子:1、小明在JAVA贴吧发帖,内容是我爱JAVA:2、被中间人攻击,内容改成我爱PHP3、小明被群嘲(手动狗头)可以看出在HTTP传输过程中,中间人可以看到并修改HTTP通信中的所有请求和响应内容,所以使用HTTP是非常不安全的。1.3防止中间人攻击这时候可能有人想到了。由于内容是明文,所以我使用对称加密来加密消息,这样中间人就看不到明文了。所以改造如下:1.双方约定加密方式2.使用AES加密报文,这样看似中间人无法获取明文信息,但实际上加密方式和秘钥会是在通信过程中以明文形式暴露。如果第一次通信被拦截,秘钥就会泄露给中间人,中间人仍然可以解密后面的通信:那么在这种情况下,我们肯定会考虑是否可以将秘钥加密,不让中间人看到?答案是肯定的,使用非对称加密,我们可以通过RSA算法来实现。约定加密方式时,服务器生成一对公私钥,服务器将公钥返回给客户端,客户端在本地生成一串秘钥(AES_KEY)进行对称加密,并用获取服务器发送的公钥(AES_KEY_SECRET),然后返回给服务器。服务端通过私钥对客户端发送的AES_KEY_SECRET进行解密,得到AEK_KEY。最后客户端和服务端使用AEK_KEY对消息进行加密。变换如下:可以看到,在这种情况下,中间人是不可能窃取到AES加密使用的秘钥的,所以后面的通信肯定是不可能解密的,那么这样做就绝对安全吗?所谓道高一尺,魔高一尺。为了对应这种加密方式,中间商想出了一个新的方案。由于拿不到AES_KEY,我就把自己模拟成client和server的组合。在用户->中介的过程中,中介模拟服务器的行为,从而得到用户请求的明文。在中介->服务器的过程中,中介模拟客户端的行为,从而可以得到服务器响应的明文,从而进行中介攻击:这次通信又被中介拦截了。中介还伪造了一对公私钥,并将公钥发送给用户,以窃取客户端生成的AES_KEY。拿到AES_KEY后,就可以轻松解密了。有没有办法制裁中介为所欲为?当然有。接下来我们看看HTTPS是如何解决通信安全问题的。2、HTTPS协议2.1HTTPS简介HTTPS实际上是SSL+HTTP的缩写。当然现在SSL已经基本被TLS取代了,但是我们还是会用SSL作为简称。SSL协议不仅适用于HTTP协议,还适用于各种应用层协议,如:FTP、WebSocket。其实SSL协议和上一节的非对称加密大致相同。握手的主要目的是交换秘钥,然后在通信过程中使用对称加密进行通信。大致流程如下:这里我只是画了一个示意图。其实真正的SSL握手要比这复杂的多,但是本质还是一样的,这里需要重点关注的是HTTPS是如何防止中间人攻击的。从上图可以看出,服务端通过SSL证书传递公钥,客户端会验证SSL证书。证书认证体系是保障SSL安全的关键。接下来,我们就来讲解一下CA认证体系,看看它是如何防止中间人攻击的。2.2CA认证系统在上一节中,我们看到客户端需要验证服务器返回的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的理解更深。