TLS握手过程
HTTP由于是明文传输,所谓的明文,就是客户端与服务端通信的信息都是肉眼可见的,随时用一个抓包工具都可以接活通信的内容。
所以安全上存在一下三个风险:
- 窃听风险,比如通信链路上可以获取通信内容。
- 篡改风险,比如强制植入垃圾广告。
- 冒充风险,比如钓鱼网站。
HTTPS在HTTP与TCP层之间加入了TLS协议,来解决上述的风险。
TLS协议是如何解决HTTP的风险呢?
- 信息加密:HTTP交互信息是被加密的,第三方就无法窃取。
- 校验机制:校验信息UR书过程中是否有被第三方篡改过,如果被篡改过,则会有警告提示;
- 身份证书:证明是真的网站。
可见,有了TLS协议,能保证HTTP通信是安全的了,那么在进行HTTP通信前,需要先进性TLS握手。如图1所示。
图1 TLS的握手过程
上图简要介绍了TLS的握手过程,其中每一个框都是一个记录,记录是TLS收发数据的基本单位,类似于TCP里的segment。多个记录可以组合成一个TCP包发送,所以通常经过四个消息局可以完成TLS握手,也就是需要2个RTT的时延,然后就可以在安全的通信环境里发送HTTP报文,实现HTTPS协议。
所以可以发现,HTTPS是应用层协议,需要先完成TCP连接建立,然后走TLS握手过程,才能建立通信安全的连接。
事实上,不同的秘钥交换算法,TLS的握手过程可能会有一些区别。
秘钥交换算法,因为考虑到性能的问题,所以双方在加密应用信息时使用的是对称加密秘钥,而对称加密秘钥是不能被泄漏的,为了保证对称加密秘钥的安全性,所以使用非对称加密的方式来保护对称加密秘钥的协商,这个工作就是秘钥交换算法负责的。
接下来,我们就以最简单的RSA秘钥交换算法,来看看它的TLS握手过程。
RSA握手过程
传统的TLS握手基本都是使用RSA算法来实现秘钥交换的,在将TLS证书部署服务端时,证书文件中包含一堆公私钥,其中公钥会在TLS握手阶段传递该客户端,私钥则一直留在服务端,一定要确保私钥不能被窃取。
在RSA秘钥协商算法中