HTTP由于是明文传输,客户端与服务端通信的信息都是肉眼可见的,随意使用一个抓包工具都可以截获通信的内容,例如WireShark。
所以安全上存在以下三个风险:
- 窃听风险,比如可以通信链路上获取通信内容。
- 篡改风险,比如强制植入垃圾广告,视觉污染。
- 冒充风险,比如冒充淘宝网站。
HTTPS是在HTTP的基础上使用SSL/TLS来加密报文,对窃听和中间人攻击提供合理的防护。
总的通信过程可以分为三个阶段:
1、TCP的三次握手
2、TLS的连接
3、Http请求和响应
TCP的三次握手之前已经分析过,不太了解的同学可以先移步学习:构建你的网络知识体系 - TCP
本文主要讲解第二点:TLS的连接。
1、SSL/TLS是什么
TLS(Transport Layer Security),译为:传输层安全协议。前身是SSL(Secure Sockets Layer),译为:安全套接层。它工作在传输层与应用层之间。
2、TLS的连接
TLS的连接也和TCP一样,有握手的过程,不过TLS需要进行四次握手。这四次握手又大概可以分为十个步骤:
第一次握手
① Client Hello
客户端首先会发一个「Client Hello」消息,字面意思我们也能理解到,这是跟服务器「打招呼」。消息体里面包含的东西:
1、TLS的版本号。
2、支持的加密组件(Cipher Suite)列表。加密组件是指所使用的加密算法及密钥长度等。
3、一个随机数(Client Random)。
第二次握手
② Server Hello
这次是服务器发送一个「Server Hello」消息,服务器向客户端打招呼。消息体里面包含的东西:
1、TLS的版本号。
2、选择的加密组件。刚才客户端向服务器发送了支持的加密组件列表,这个选中的加密组件就是从那个列表中挑选出来的。
3、一个随机数(Server Random)
③ Certificate
服务器向客户端发送CA签名过的公钥证书。
④ Server Key Exchange
服务端向客户端发送用以实现ECDHE
算法的一个参数(Server Params)。
为了防止伪造,Server Params经过了服务器私钥签名。
ECDHE是一种密钥交换算法。
⑤ Server Hello Done
告知客户端,这一次协商结束。
目前为止,客户端和服务端之间通过明文共享了:Client Random,Server Random,Server Params,而且客户端也拿到了服务端的公钥证书。接下来客户端会校验公钥证书的有效性,并使用公钥证书解密私钥签名过的Server Params。
第三次握手
⑥ Client Key Exchange
客户端发送用以实现ECDHE算法的另一个参数(Client Params)。
到目前为止,客户端和服务器都拥有了ECDHE
算法需要的2个参数:Server Params、Client Params。
客户端、服务器都可以使用ECDHE
算法,根据Server Params、Client Params计算出一个新的随机密钥串:Pre-master secret,然后结合Client Random、Server Random、Pre-master secret生成一个主密钥。利用该主密钥可以衍生出其他密钥:客户端发送用的会话密钥、服务器发送用的会话密钥等。
⑦ Change Cipher Spec
告知服务器,之后的通信会使用计算出来的会话秘钥进行加密。
⑧ Finished(Encrypted Handshake Message)
包含连接至今全部报文的整体校验值(摘要),加密之后发送给服务器。
这次握手协商是否成功,要以服务器是否能够正确解密该报文作为判定标准。
第四次握手
⑨ Change Cipher Spec
服务器同样发送Change Cipher Spec报文。
⑩ Finished(Encrypted Handshake Message)
服务器同样发送Finished报文。
3、总结
到此为止,若客户端、服务器的加密解密都被验证过没问题,TLS的握手过程将正式结束,后面将使用得到的会话秘钥加密HTTP请求和响应。
TLS四次握手所做的事情,概括起来就是:客户端和服务端互相协商,各自给出一些参数,经过ECDHE算法算出通信用的对称秘钥,然后双方验证秘钥的加密解密。。