浅析SSL/TSL的通信机制
Secure Sockets Layer 安全套接字层
Transport Layer Security 传输层安全
TLS是基于SSL3.0之后升级设计的协议,相当于SSL的后续版本。
信息安全概述中介绍了信息安全中要保证信息的3大特性:保密性(防窃听)、完整性(防篡改)、不可抵赖性(防抵赖)。SSL的设计中对以上特性都进行了考虑,可谓信息安全的集大成者。
SSL通信的总体思路是使用公钥加密对称密钥,使用对称加密数据。
- 为什么不都使用公钥加密?
对称加密主要为位运算,而非对称加密都是大数相乘,取模。对CPU压力较大。
SSL握手过程
SSL会话协商的过程如下:
1.客户端(ClientHello)
首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。请求中包含如下信息。
1 | (1) 支持的协议版本,比如TLS 1.0版。 |
2.服务器回应(SeverHello)
服务器的回应包含以下内容。
1 | (1) 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。 |
3. 客户端回应
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。
1 | (1) 一个随机数-C。该随机数用服务器公钥加密,防止被窃听。 |
4.服务器的最后回应
服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的”会话密钥”。然后,向客户端最后发送下面信息。
1 | (1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。 |
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用”会话密钥”加密内容。
SSL整个握手的过程就是协商出一个安全密钥的过程。那么问题来了,如何在不安全的信道上交换一个密钥呢。
如何传递密钥
在不安全的信道上传递加密文件是没有问题的,因为黑客拿到加密文件没有用。但是,如何如何在不安全的信道上安全地传输密钥?
要解决这个问题,密钥交换算法即DH算法:Diffie-Hellman算法应运而生。
DH算法解决了密钥在双方不直接传递密钥的情况下完成密钥交换,这个神奇的交换原理完全由数学理论支持。
1 | 我们来看DH算法交换密钥的步骤。假设甲乙双方需要传递密钥,他们之间可以这么做: |
所以,更确切地说,DH算法是一个密钥协商算法,双方最终协商出一个共同的密钥,而这个密钥不会通过网络传输。
如果我们把a看成甲的私钥,A看成甲的公钥,b看成乙的私钥,B看成乙的公钥,DH算法的本质就是双方各自生成自己的私钥和公钥,私钥仅对自己可见,然后交换公钥,并根据自己的私钥和对方的公钥,生成最终的密钥secretKey,DH算法通过数学定律保证了双方各自计算出的secretKey是相同的。