1、SSL 简介

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

在标准的 HTTP 协议下,客户端与服务端直接通过 TCP 链接,以 明文 的形式交换数据,这样做其实在传输一些普通网页数据时并没什么问题,但是如果用户在浏览网页中,需要向服务端发送用户名、密码、银行卡号之类的敏感信息的话,我们不希望这些信息被入侵者所获取,也不希望其遭到篡改或伪造,这时就需要用到 SSL 了。

一个安全的通信往往需要包含三个特性:机密性、数据完整性、端点鉴别,三者缺一不可。

机密性:如果没有机密性,入侵者就可能截获客服端的报文,并获取其的敏感信息。

数据完整性:如果没有数据完整性,入侵者就可以随意篡截获的客户端报文,并对其的信息进行随意的篡改。

端点鉴别:如果没有端点鉴别,客服端所请求的服务器有可能是一个钓鱼网站,用来恶意收集用户的敏感信息。

SSL 就是通过提供机密性、数据完整性以及服务端和客户端鉴别,来强化一个普通的 TCP 链接。

因为 SSL 协议是运行在 TCP 之上的,因此,理论上来讲它能为包括 HTTP 协议在内的任何基于 TCP 连接的应用层协议提供安全性保障。下面来看一下 SSL 的工作原理。

2、SSL 工作原理

SSL 的工作主要可以分为三个阶段:握手、密钥导出、数据传输。

2.1、握手阶段:

在握手阶段需要完成的三个任务分别是:建立一条 TCP 连接、验证服务端身份、分发通信主密钥。大致过程描述如下:

客户端首先发起一条到服务端的 TCP 连接,随后的数据传输都是在这条 TCP 连接之上的,在 TCP 链接建立之后,客户端会向服务端发送 HELLO 报文,这个报文中包含了客户端所支持的密码算法列表,服务端在接收后会选用一种对称算法,一种非对称算法和一种 MAC 算法,连同其 证书 回应给客户端(这个证书就是经过权威机构认证的一个实体与其公钥的绑定)。

因为在各种的加密过程中,只要是涉及到使用公开密钥的,一般都会有公钥被入侵者盗用和伪造的风险,这时就需要权威机构颁发的数字证书来证明一个公要与实体的绑定。

客户端在收到服务端发来的证书之后,就可以明确的知道当前正在跟自己通信的服务端就是目标服务器,客户端随后会从证书中提取服务端发来的公钥,并在客户端生成一个随机的主密钥 MS,然后用服务端的公钥对其进行加密后发送给服务端,服务端会用自己的私钥解密得到主密钥 MS,这样就完成了主密钥的分发。

客户端和服务器都掌握了主密钥,有了这个其他人都不知道的主密钥,随后的数据加密和验证过程就好办了。

2.2、密钥导出:

密钥导出阶段,就是通信双方会以相同的方法,用主密钥生成四个密钥,这四个密钥的分别作用如下:

EB:用于从服务端到客户端发送数据的会话加密密钥

MB:用于从服务端到客户端发送数据的会话 MAC 密钥

EA:用于从客户端到服务端发送数据的会话加密密钥

MA:用于从客户端到服务端发送数据的会话 MAC 密钥

会话加密密钥就是实际用来加密传输数据的对称密钥,MAC 密钥在是标志传输数据完整性的密钥。

MAC:报文鉴别码,是一种用来监测报文完整性的技术。它的过程并不复杂,发送方将明文与一个鉴别密钥进行级联,这个鉴别密钥是通信双方所共有的,随后会计算这个级联后的数据散列值,这个散列值就叫做原始数据的报文鉴别码 MAC,将报文的鉴别码附加在原始明文后面,一同发送给接收方。接收方用收到的明文,级联相同的鉴别密钥,再以相同的方法计算散列值,与收到的散列值 MAC 进行对比,若两者相同,则说明数据未被篡改,上述的 MA 和 MB 就是 MAC 里的鉴别密钥。

2.3、数据传输:

SSL 将数据流分割成记录,对每个记录 EA 加密,并附加一个 MAC(用于完整性鉴别),然后对该记录与 MAC 进行加密,然后将这个被加密的包发送服务器,服务端收到这个数据包后,用相应的 EB 对称密钥进行解密,再用 MB 进行数据完整性检验。

3、报文重放攻击

上述操作看似是实现了对安全通信的三个基本需求,但是其对整个会话过程中报文流的数据完整性的保障并未达到天衣无缝,虽然单个记录的报文完整性可以由 MAC 保障,但是若是入侵者恶意调换两个 SSL 记录的顺序,或者故意多次重放同一个 SSL 记录多次,这样会导致接收方收到的最终报文不正确,这也就是 "报文重放攻击"。

不过这个问题可以通过序号来解决,你可能会想,在每一个记录中增加一个序号不就行了么,但是实际上不必直接在 SSL 记录中额外包含一个序号,只需要由发送方自己维护一个计数器,每发送一次,就将自己的计数器 +1,并在计算记录 MAC 时,将这个需要括在 MAC 中的记录中,接收方也跟踪自己收到的所有记录的序号,同样在计算记录 MAC 进行校验时,让自己跟踪到的序号参与计算,若计算结果相同就说明记录即通过了完整性检验,也没有被篡改顺序。