HTTPS解决了什么问题?
前言
说起HTTPS,相信每个技术人都不陌生,都知道它能够带来安全上的提升,如果再深入问一下HTTPS如何带来安全上的提升?
相信有一部分同学犹豫片刻后也能给出答案:HTTPS由HTTP协议+SSL/TSL协议组成,通过在应用层(HTTP)与运输层(TCP)之间加入安全套接层来实现数据加密解密功能,从而实现数据的安全传输。
但是如果继续追问:**请你详细说说HTTPS具体解决了什么场景下的哪些问题?是如何解决的?**相信大多数人已经开始沉默了。
如果你刚好也存在相同的疑惑,那么就请你带着些许耐心细细品味此文吧。温馨提示:阅读本文需要计算机网络、TCP/IP分层协议、加密算法、摘要算法、签名算法等相关知识储备
互联网的接入方式
在日常生活中我们主要通过WIFI或网线的方式连接到路由器,然后路由器负责接入互联网,服务器(Server)则作为互联网的一部分为客户端提供服务。(如下图所示)
可以看到在这个过程中客户端的数据(流量)需要经过路由器和互联网(Internet)的正确转发才能到达服务器,而服务器返回的数据也需要经过互联网和路由器才能到达客户端,而在一些不安全的网络环境中,你所连接的路由设备很有可能被黑客所控制(如下图所示),那么黑客就可以通过流量分析出其中的信息从而造成信息泄漏的问题,甚至可以在你不知情的情况下用你的身份信息做一些别的事情(数据篡改、请求重放)。
了解过计算机网络的同学应该知道,计算机网络的核心部分是由许多的路由设备连接在一起构成的,Client产生的流量往往会在网络中途径许多路由设备才能到达Server。作为终端用户,即使我们可以保证自己的路由设备是安全的,但是仍然无法确保互联网中所有的路由器都是安全的。
基于以上痛点,人们开始研究一种方案来提高互联网的安全性,考虑到保证互联网中所有路由设备的安全性是不现实的,于是人们开始寻找一种替代方案:既然黑客是通过流量分析得到的相关信息,那么是否可以对流量进行加密处理从而混淆黑客捕获的数据信息?答案自然是肯定的,下图描绘了基于对称加密算法进行数据传输的一个大致过程。
可以看到Client与Server通过相同的加密秘钥(“abca”)对数据进行加密与解密,基于此方案避免了数据在传输过程中泄露的问题。但是随之而来的则是另一个问题:如何协商对称加密秘钥?
作为服务端可能提供了各式各样的服务,有些服务对应的客户端或许只是一个web浏览器,如果将秘钥内置在web浏览器中是及其不安全的,并且加密秘钥也会随着时间线的拉长而增加其暴露的风险。于是人们又讨论出一个解决方案:不预先生成对称加密秘钥,而是在客户端与服务端交互的过程中随机生成对称加密秘钥,并且在互联网中安全的传输对称加密秘钥,这样一来既能够保证数据的安全性,又能够缩短秘钥的生命周期,减少了其暴露的风险。
于是问题进一步演化为:如何在互联网中安全的传输对称加密秘钥?
Https的实现原理解析
SSL/TLS协议如何协商对称加密秘钥?
在HTTP协议中需要经过3次握手才能建立TCP链接,而同样的在SSL/TLS协议中也规定了如下所示的握手协议,图中标注了3个阶段(为了不影响整体的阅读体验,所以用了很淡的灰色框框,并且在右下角标注了序号)。
tip:由于这里牵扯到非对称加密以及CA证书的概念,因此简单的介绍一下CA证书:CA证书可以简单理解为权威机构为服务端(域名)颁发的网络身份证,通常包含服务端公钥、权威机构签名、持有人等相关信息
- 第一个阶段中客户端与服务端确定了SSL协议的版本号、所使用的密码套件、双方生成的随机数等
- 第二个阶段中服务端将自己的CA证书发送给客户端进行验证
- 第三个阶段中客户端基于双方的随机数生成此次会话的"对称加密秘钥",并使用CA证书中的公钥对"对称加密秘钥"加密并传输给服务端
tip:严格意义上讲,这是一个用于讲解HTTPS协议本质的类SSL握手协,真实的握手协议会更加复杂。
SSL/TLS协议在网络协议中的位置?
了解了SSL协议的内部实现细节之后,需要我们回过头来从宏观的角度审查一下SSL协议所处的位置。这里引用一下文章开头提到的一段话:HTTPS由HTTP协议+SSL/TSL协议组成,通过在应用层(HTTP)与运输层(TCP)之间加入安全套接层来实现数据加密解密功能,从而实现数据的安全传输。 分层结构如下图所示
数据从客户端到服务端的流向如下图所示
从宏观上看,客户端的数据包会首先通过安全套接层(SSL/TLS)进行一次加密,然后再经过一条长长的链路才能到达服务器,而在客户端与服务器之间的中间设备(路由器)虽然可以拿到原始数据/流量包,但是由于缺乏对称加密秘钥,所以无法解析出真实的数据/流量信息,以此便达到了安全传输的目的。
SSL/TLS协议所解决了那些问题
数据泄漏
由于SSL安全套接层在握手协议中交换了加密秘钥,然后对数据进行了加密处理。因此在互联网中传输的都是加密后的数据流量,即使被中间路由设备拦截,没有相应的秘钥也无法获取其中的信息。
数据篡改
SSL协议基于摘要算法对数据包进行签名,并且在SSL层会进行完整性校验。因此可以解决数据篡改的问题
请求重放
请求重放分两种情况,第一种是连接重放,第二种是分组重放。连接重放是指捕获了HTTPS流量后,虽然无法解析其内容,但是可以在后续的某个时间重新与服务器建立连接并将第一次的https流量进行重发。解决连接重放的关键因素是客户端与服务端的不重数,因为不重数的原因每次与服务器建立起https连接时都会得到不同的加密秘钥,因此客户端也就无法实现连接重放。
分组重放是另外一种比较高级的攻击方式,指攻击者不建立新的https连接,而是使用同一个连接针对ssl分组(数据包)进行的重放行为。解决分组重放的关键因素是序号,ssl协议会在客户端维护一个序号计数器,每发送一个SSL数据包该序号就会加一,当服务端收到序列号重复的数据包时就会直接将其丢弃,同时因为该序号参与完整性校验,因此即使序号不存在被篡改的风险。
中间人攻击
中间人攻击是指在客户端与服务器中间存在一个攻击者,在建立连接时,攻击者一方面伪造成客户端与服务器进行交互,另一方面伪造成服务器与客户端交互。。
解决此问题的关键因素是数字证书,服务器通过向权威机构申请数字证书证明自己身份,并在握手阶段将数字证书返回给客户端进行验证。
tip:数字证书也可以叫做CA证书,属于PKI体系中的一个概念,用来解决互联网中的信任问题。
刨根问底的问题
- 客户端与服务端为什么需要使用对称加密而不是非对称加密?
- SSL/TLS协议绝对安全吗?
- 客户端如何确定服务端的CA证书是有效证书?
参考资料
- 《计算机网络自顶向下方法第7版》
- 《计算机网络7》
- 《PKI/CA与数字证书技术大全》