十四、SSL/TLS-为了更安全的通信

1 本章概要

SSL(Secure Socket Layer)与TLS(Transport Layer Security)是不同的,TLS 相当于是 SSL 的后续版本。

2 什么是 SSL/TLS

2.1 客户端与服务器

将 Alice 和 Bob 书店的通信过程整理如下图(不使用SSL/TLS):

Alice 向 Bob 书店发送信用卡号使用 HTTP 来完成。 Alice 输入信用卡号之后按下提交按钮,这时客户端(Web浏览器)就会将信用卡号作为 HTTP 请求发送给服务器。服务器则会将“生成订单”的网页作为 HTTP 响应返回给客户端。

不过,如果直接发送请求的话,信用卡号就很可能被窃听。

2.2 用 SSL/TLS 承载 HTTP

当 Web 浏览器发送信用卡号时,信用卡号的数据会作为客户端请求发送给服务器。使用 SSL/TLS 作为对通信进行加密的协议,然后在此之上承载 HTTP。通过将两种协议进行叠加,我们就可以对 HTTP 的通信(请求和响应)进行加密,从而防止窃听。

2.3 SSL/TLS 的工作

进行安全的通信,我们有几个必须要解决的问题:

  1. Alice 的信用卡号和地址在发送到 Bob 书店的过程中不能被窃听。
  2. Alice 的信用卡号和地址在发送到 Bob 书店的过程终不能被篡改。
  3. 确认通信对方的 Web 服务器是真正的 Bob 书店。

在这里,1 是机密性问题,2 是完整性的问题, 3 则是认证的问题。
要解决这些问题,让我们在密码学家的工具箱中找一找:
要确保机密性,可以使用对称密码。由于对称密码的秘钥不能被攻击者预测,因此我们使用伪随机数生成器来生成秘钥。若要将对称密码的秘钥发送给通信对象,可以使用公钥密码或者 Diffie-Hellman 秘钥交换。
要识别篡改,对数据进行认证,可以使用消息认证码。消息认证码是使用单向散列函数来实现的。
要对通信对象进行认证,可以使用对公钥加上数字签名所生成的证书。
好,工具已经找齐了,下面只要用一个“框架”(framework)将这些工具组合起来就可以了。SSL/TSL 协议其实就扮演了这样一种框架的角色。

2.4 SSL/TLS 也可以保护其它的协议

刚刚我们提到用 SSL/TLS 承载 HTTP 通信,这是因为 HTTP 是一种很常见的协议。其实 SSL/TSL 上面不仅可以承载 HTTP,还可以承载其它很多协议。例如,发送邮件时使用的 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)和接收邮件时使用的 POP3(Post Office Protocol,邮局协议)都可以用 SSL/TSL 进行承载。在这样的情况下, SSL/TSL 就可以对收发的邮件进行保护。

2.5 密码套件

SSL/TLS 提供了一种密码通信的框架,这意味着 SSL/TSL 中使用的对称密码、公钥密码、数字签名、单向散列函数等技术,都是可以像零件一样进行替换的。也就是说,如果发现现在所使用的某个密码技术存在弱点,那么只要将这一部分进行替换就可以了。
尽管如此,也并不是说所有的组件都可以自由选择。由于实际进行对话的客户端和服务器必须使用相同的密码技术才能进行通信,因此如果选择过于自由,就难以确保整体的兼容性。为此, SSL/TSL 就事先搭配好饭盒一样,规定了一些密码技术的“推荐套餐”,这种推荐套餐称为密码套件(cipher suite)。

2.6 SSL 与 TLS 的区别

SSL(Secure Socket Layer,安全套接层)是 1994 年由网景(Netscape)公司设计的一种协议。而 TLS(Transport Layer Security,传输层安全)是 IETF 在 SSL3.0 的基础上设计的协议,在 1999 年作为 RFC2246 发布的 TLS1.0 ,实际上相当于 SSL3.1 。

3 使用 SSL/TLS 进行通信

下面介绍使用 SSL/TLS 进行通信的步骤。本节内容是基于 TLS1.0 编写的,因此直接写作 TLS。

3.1 层次化的协议

TLS 协议是由“TLS记录协议”(TLS record protocol)和“TLS握手协议”(TLS handshake protocol)这两层协议叠加而成的。位于底层的 TLS记录协议负责进行加密,而位于上层的 TLS握手协议则负责除加密以为的其它各种操作。上层的 TLS握手协议又可以分为 4 个子协议。TLS协议的层次结构如下:

下面简单介绍一下其中各个协议的功能

1.TLS记录协议

TLS记录协议位于 TLS握手协议的下层,是负责使用对称密码对消息进行加密通信的部分。
TLS记录协议中使用了对称密码和消息认证码,但是具体的算法和共享秘钥则是通过握手协议在服务器和客户端之间协商决定的。

2.TLS握手协议

TLS 握手协议分为下列 4 个子协议:握手协议、密码规格变更协议、警告协议和应用数据协议。

2-1 握手协议

握手协议是 TLS握手协议的一部分,负责在客户端和服务器之间协商决定密码算法和共享秘钥。基于证书的认证操作也是在这个协议中完成的。它是 4 个子协议中最复杂的一个。这个协议大致相当于下面这段对话:
客户端:“你好。我能够理解额密码套件由 RSA/3DES,或者 DSS/AES,请问我们使用哪一种密码套件来通信呢?”
服务器:“你好。那么我们用 RSA/3DES 来进行通信吧,这是我的证书。”
在服务器和客户端之间通过握手协议协商一致之后,就会相互发出信号来切换密码。负责发出信号的就是下面要介绍的密码规格变更协议。

2-2 密码规格变更协议

密码规格变更协议是 TLS握手协议的一部分,负责向通信对象传达变更密码方式的信号。简单地说,就跟向对方喊“1、2、3!”差不多。
这个协议所发送的消息,大致相当于下面的对话:
客户端:“好,我们按照刚才的约定切换密码吧。1、2、3!”
当协议中途发生错误时,就会通过下面的警告协议传达给对方。

2-3 警告协议

警告协议是 TLS握手协议的一部分。警告协议负责在发生错误时将错误传达给对方。
这个协议所发送的消息,大致相当于下面的对话:
服务器:“刚才的消息无法正确解密哦!”
如果没有发生错误,则会使用下面的应用数据协议来进行通信。

2-4 应用数据协议

应用数据协议是 TLS 握手协议的一部分。应用数据协议是将 TLS 上面承载的应用数据传达给通信对象的协议。
下面我们按照相同的顺序,更加详细地介绍一下 TLS协议。

3.2 TLS记录协议

TLS记录协议负责消息的压缩、加密以及数据的认证,其处理过程如下:

  1. 消息被分割成多个较短的片段(fragment),然后分别对每个片段进行压缩。压缩算法需与通信对象协商决定。
  2. 经过压缩的片段会被加上消息认证码,这是为了保证完整性,并进行数据的认证。通过附加消息认证码的 MAC 值,可以识别出篡改。与此同时,为了防止重放攻击,在计算消息认证码时,还加上了片段编号。单向散列函数的算法,以及消息认证码所使用的共享秘钥都需要与通信对象协商决定。
  3. 经过压缩的片段再加上消息认证码会一起通过对称密码进行加密。加密使用 CBC模式。
  4. 最后,上述经过加密的数据再加上由数据类型、版本号、压缩后的长度组成的报头(header)就是最终的报文数据。其中,数据类型为 TLS记录协议所承载的 4 个子协议的其中之一。

3.3 TLS握手协议

1.握手协议

握手协议是 TLS握手协议的一部分,负责生成共享秘钥以及交换证书。其中,生成共享秘钥是为了进行密码通信,交换证书是为了通信双方互相进行认证。
握手协议这一名乘中的“握手”(handshake),是服务器和客户端在密码通信之前交换一些必要信息这一过程的比喻。
由于握手协议中的信息交换是在没有加密的情况下进行的(即使用“不加密”这一密码套件),也就是说,在这一协议中所收发的所有数据都可能被窃听者 Eve 所窃听,因此,在这一过程中必须使用公钥密码或者 Diffie-Hellman 秘钥交换。

下面我们来详细讲解握手协议中所交换的消息。

2.密码规格变更协议

TLS 的密码规格变更协议(change cipher spec protocol)是 TLS握手协议的一部分,用于密码切换的同步。
那么为什么这个协议不叫密码规格开始协议,而叫密码规格变更协议呢?这是因为即便在密码通信开始之后,客户端和服务器也可以通过重新握手来再次改变密码套件。也就是说,在最开始的时候,客户端和服务器是使用“不加密”这一密码套件进行通信的,因此通信内容没有进行加密。

3.警告协议

TLS 的警告协议(alert protocol)是 TLS握手协议的一部分,用于当发生错误时通知通信对象。当握手协议的过程中产生异常,或者发生消息认证码错误、压缩数据无法解压缩等问题时,会使用该协议。

4.应用数据协议

应用数据协议是 TLS握手协议的一部分,用于和通信对象之间传送应用数据。
当 TLS 承载 HTTP 时,HTTP 的请求和响应就会通过 TLS 的应用数据协议和 TLS 记录协议来进行传送。

3.4 主密码

主密码是 TLS 客户端和服务器之间协商出来的一个密码的数值。这个数值非常重要,TLS 密码通信的机密性和数据的认证全部依靠这个数值。
主密码是根据:预备主密码、客户端随机数、服务器随机数计算出来的。

3.5 TLS 中使用的密码技术小结

4 对 SSL/TLS 的攻击

4.1 对各个密码技术的攻击

针对 SSL/TLS 中使用的各个密码技术的攻击,会直接成为对 SSL/TLS 的攻击。例如,如果能够找到 SSL/TLS 中使用的对称密码的弱点,就相当于找到了 SSL/TLS 通信机密性的弱点。
然而, SSL/TLS 作为框架的特性也正是在这里能够得以体现。 SSL/TLS 并不依赖于某种特定的密码技术,当发现某种对称密码存在弱点时,今后只要选择不包含该对称密码的密码套件就可以了。这就好像一台机器的某个零件损坏时,只要更换这个损坏的零件就可以了。

4.2 对伪随机数生成器的攻击

只要生成伪随机数生成器的种子在可预测范围内,其生成的秘钥是可以被预测的。

4.3 利用证书的时间差进行攻击

SSL/TLS 中,客户端会使用服务器证书对服务器进行认证。在这个过程中,客户端需要使用合法认证机构的公钥对证书所附带的数字签名进行验证。正如第十章所提到那样,如果证书已过期,但是 Web 浏览器没有获取到最新版的信息,这是无法保证通信的安全的。

5 SSL/TLS 用户的注意事项

5.1 不要误解证书的含义

在 SSL/TLS 中,我们能够通过证书对服务器进行认证。然后这里的认证,知识确认了通信对象是经过认证机构确认的服务器,并不能确认是否可以和该通信对象进行安全的在线购物交易。直白点,就是即便对方拥有合法的证书,也不代表你就可以放心地发送信用卡号,因为仅通过 SSL/TLS 是无法确认对方是否在从事信用卡诈骗的。
此外,认证机构所进行的本人身份确认也分为不同的等级,需要仔细确认一下认证机构的业务规则。
为了提高 SSL/TLS 运用的可靠性,一个名为 CA/Brower 论坛的组织制定了 EV SSL 证书(Extended Validation Certificate)规范。

5.2 密码通信之前的数据时不受保护的

SSL/TLS 仅对通信过程中的数据进行保护,而无法保护通信前的的数据。

5.3 密码通信之后的数据时不受保护的

SSL/TLS 也无法保护通信之后的数据。
因此信用卡号不会再通信过程中被第三方获取,而信用卡号在通信之前被偷窥,以及在通信之后,服务器被窃取可能性还是存在的。

6 本章小结

SSL/TLS 是将对称密码、公钥密码、单向散列函数、消息认证码、伪随机数生成器、数字签名等技术相结合来实现安全通信的。通过切换密码套件来使用强度更高的密码算法。

7 小测验

  1. 使用 SSL/TLS 可以确保通信的机密性。
  2. 在 SSL/TLS 中,使用数字签名技术来认证通信双发的身份。
  3. 在 SSL/TLS 中,由于使用了公钥密码或者秘钥交换技术,因此伪随机数生成器的品质低一点也没有关系。
  4. 在 SSL/TLS 中,由于公钥是服务器发送的,因此客户端无需持有任何公钥就可以对服务器进行认证。
  5. 使用 SSL/TLS 的公司是可信的,因此可以放心地发送信用卡号。