HTTP是什么以及其缺点

HTTP是属于应用层的协议,它是基于TCP/IP的,所以它只是规定一些要传输的内容,以及头部信息,然后通过TCP协议进行传输,依靠IP协议进行寻址,通过一幅最简单的图来描述,如下:

HTTPS加密机制解析与总结_SSL


客户端发出请求,服务端进行响应,就是这么简单。在整个过程中,没有任何加密的东西,所以它是不安全的,中间人可以进行拦截,获取传输和响应的数据,造成数据泄露。

HTTPS为什么是这样的?

一、对称加密

为了解决HTTP不安全的问题,我们能想到最简单的提高安全性的方法就是在传输前对数据进行加密,如下图:

HTTPS加密机制解析与总结_非对称加密_02


这种加密方式叫做对称加密:加密和解密用同一个秘钥的加密方式叫做对称加密;对称加密可以在一定程度上提高HTTP的安全性,但还不能彻底解决,因为客户端不止一个,在互联网上有成千上万的客户端,所有的客户端都应用同一个秘钥A,这种方式很显然是不合理的,破解了一个用户,所有的用户信息都会被盗取,如下图:

HTTPS加密机制解析与总结_数字签名_03


针对上述问题,可以做如下改进:对每一个客户端都用不同的秘钥进行传输,如下:

HTTPS加密机制解析与总结_非对称加密_04


对每个客户端应用不同的对称加密秘钥,那么这个秘钥客户端或者服务端是如何知道的呢,只能是在一端生成一个秘钥,然后通过HTTP传输给另一端,如下图:

HTTPS加密机制解析与总结_对称加密_05

那么会引入新的问题:这个传输秘钥的过程,又如何保证加密? 如果被中间人拦截,秘钥也会被获取。也许你会说,对秘钥再进行加密,那又如何保证对秘钥加密的过程,是加密的呢?如此我们就走入了 不断加密的死循环。

二、非对称加密

既然对称加密不能解决问题,便出现了一种的新的方式——非对称加密,比如应用最广的RSA算法。

非对称加密会有一对秘钥:公钥和私钥。

公钥加密的内容,只有私钥可以解开,私钥加密的内容,所有的公钥都可以解开(当然是指和秘钥是一对的公钥)。

私钥只保存在服务器端,公钥可以发送给所有的客户端,如下图:

HTTPS加密机制解析与总结_HTTPS_06

采用如上方式可以保证客户端通过公钥加密的内容,中间人是无法破解的,因为私钥只保存在服务器端,只有私钥可以破解公钥加密的内容。

但上述方式依旧存在一个问题:公钥会被中间人拿到并篡改,如下图:

HTTPS加密机制解析与总结_HTTPS_07


这种攻击方式叫做MITM(Man-in-the-MiddleAttack),此时客户端拿到的公钥是假的

公钥被掉包,是因为客户端无法分辨传回公钥的到底是中间人,还是服务器,这也是密码学中的身份验证问题。

三、第三方认证和数字签名

为了解决上述MITM问题,HTTPS采用证书 + 数字签名的方式。

假设某第三方机构的加密方式是MD5,该第三方机构将网站A的信息加密后并使用自己的私钥再次进行加密,就生成了网站A的数字签名;数字签名和加密的网站信息放在一起就是数字证书,即数字证书=网站信息+数字签名,如下图:

HTTPS加密机制解析与总结_HTTPS_08


那么,为什么数字证书和数字签名可以解决非对称加密技术中的公钥被替换问题呢

因为当客户端向服务器请求公钥的时候,会得到一个数字证书(包含网站公钥和数字签名),此时客户端会使用第三方机构的公钥对证书中的数字签名进行解密,然后依照证书中的网站信息进行签名生成,对比发现不匹配,则请求失败,如下图:

HTTPS加密机制解析与总结_SSL_09


浏览器安装后会内置一些权威第三方认证机构的公钥,比如VeriSign、Symantec以及GlobalSign等等,验证签名的时候直接就从本地拿到相应第三方机构的公钥,对私钥加密后的数字签名进行解密得到真正的签名,然后客户端利用签名生成规则进行签名生成,看两个签名是否匹配,如果匹配认证通过,不匹配则获取证书失败。

说到这里,可能会有人问,数字证书中只包含网站信息不行吗?为什么一定要包含数字签名?

那是因为第三方认证机构是一个开放的平台,我们可以去申请,中间人也可以去申请,如下图:

HTTPS加密机制解析与总结_数字签名_10


如果没有签名,只对网站信息进行第三方机构私钥加密的话,会存在下面的问题:

HTTPS加密机制解析与总结_SSL_11


因为没有认证,所以中间人也向第三方认证机构进行申请,然后拦截后把所有的信息都替换成自己的,客户端仍然可以解密,并且无法判断这是服务器的还是中间人的,最后造成数据泄露。

四、对称加密加密数据

在经过第二和第三小节的纠结之后,我们终于做成了一件事:保证客户端安全地拿到服务器的公钥

在安全的拿到服务器的公钥之后,客户端会随机生成一个对称秘钥,使用服务器公钥加密,传输给服务端,此后,相关的 Application Data 就通过这个随机生成的对称秘钥进行加密/解密,服务器也通过该对称秘钥进行解密/加密,如下图:

HTTPS加密机制解析与总结_数字签名_12

HTTPS整体流程

通过,第二章节的描述我们理清楚了HTTPS的加密机制,总结起来如下:

HTTPS就是使用SSL/TLS协议进行加密传输,让客户端拿到服务器的公钥,然后客户端随机生成一个对称加密的秘钥,使用公钥加密,传输给服务端,后续的所有信息都通过该对称秘钥进行加密解密。

SSL(Secure Sockets Layer 安全套接层)及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

HTTPS = HTTP + TLS/SSL,如下图:

HTTPS加密机制解析与总结_对称加密_13


上述说的所有的HTTPS的安全校验的流程均在SSl/TLS层实现

SSL/TLS相关知识

SSL(Secure Socket Layer),为Netscape所研发,用以保障在Internet上数据传输的安全,利用数据加密(Encryption)技术,可确保数据在网络上的传输过程中不会被截取及窃听。一般通用的规格为40 bit的安全标准,美国则已推出128 bit的更高安全标准,但限制出境。只要3.0版本以上的I.E.或Netscape浏览器即可支持SSL。

当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。

SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持

SSL协议可分为两层: SSL记录协议(SSL Record Protocol)和SSL握手协议(SSL Handshake Protocol)

SSL记录协议(SSL Record Protocol)建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。

SSL握手协议(SSL Handshake Protocol)建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

SSL提供服务如下:

1)认证用户和服务器,确保数据发送到正确的客户机和服务器;
2)加密数据以防止数据中途被窃取;
3)维护数据的完整性,确保数据在传输过程中不被改变。

参考文章:
​​​HTTPS整套加密机制是如何实现的?​​​​SSL简介​