本文主要介绍SSL(Secure Sockets Layer)/TLS(Transport Layer Security)的相关知识。
1 概述
SSL及其继任者TLS是为网络通信提供安全及数据完整性的一种安全协议。
SSL由Netscape研发,用以保障在Internet上安全地进行数据传输,利用数据加密“Encryption”技术,可确保数据在网络传输过程中不会被截取或窃听。SSL的当前版本为3.0,它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输场景中。
TLS用于在两个通信应用程序之间提供保密性和数据完整性。
SSL与TLS都是在传输层上对网络连接进行加密的。
2 作用
SSL/TLS的主要作用如下:
- 认证用户和服务器,确保数据被发送到正确的客户端和服务器上;
- 加密数据以防止数据传输过程中被窃取;
- 维护数据的完整性,确保数据在传输过程中不被篡改。
3 SSL的工作过程
3.1 发送方的工作过程
消息发送方的工作过程如下:
- 从上层接收要发送的数据(包括各种消息和数据);
- 对接收到的数据进行分段,分成若干纪录;
- 使用指定的压缩算法进行数据压缩(可选);
- 使用指定的MAC(消息验证码,Message Authentication Code)算法生成MAC;
- 使用指定的加密算法进行数据加密;
- 添加SSL记录协议的头,发送数据。
3.2 接收方的工作过程
消息接收方的工作过程如下:
- 接收数据,从SSL记录协议的头中获取相关信息;
- 使用指定的解密算法解密数据;
- 使用指定的MAC算法校验MAC;
- 使用压缩算法对数据解压缩(在需要时进行);
- 将若干记录进行数据重组;
- 将重组后的数据发送给上层。
说明:SSL记录协议处理的最后一个步骤是附加一个SSL记录协议的头,以便构成一个SSL记录。SSL记录协议头中包含了SSL记录协议的若干控制信息。
4 SSL的会话状态
会话(Session)和连接(Connection)是SSL中两个重要的概念,两者定义如下:
- SSL会话:是指客户端和服务器之间的一个关联关系。SSL会话通过握手协议来创建。它定义了一组安全参数;
- SSL连接:用于提供某种类型的服务数据的传输,SSL连接是一种点对点的关系。一般来说,连接的维持时间比较短,并且每个连接一定与某一个会话相关联。
一次会话过程通常会发起多个SSL连接来完成任务,例如一次网站访问可能需要多个HTTP/SSL/TCP连接来下载其中的多个页面,这些连接共享会话定义的安全参数,这种共享方式可以避免为每个SSL连接单独进行安全参数的协商,而只需在会话建立时进行一次协商,从而提高了网络通信的效率。
每一个会话(或连接)都存在一组与之相对应的状态,会话(或连接)的状态表现为一组与其相关的参数集合,最主要的内容是与会话(或连接)相关的安全参数的集合,这些参数用于会话(或连接)中的加密解密、认证等安全功能的实现。
5 HTTPS介绍
HTTPS(HTTP over SSL,HTTP Secure)是以安全为目标的HTTP通道,在HTTP的基础上通过传输加密和身份验证保证了传输过程的安全性。
HTTPS由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回由网络传送的结果。HTTPS实际上应用了Netscape的SSL作为HTTP应用层的子层。HTTPS使用端口“443”,而不是像HTTP那样使用端口“80”来进行TCP/IP通信。
HTTPS在HTTP的基础上加入了SSL,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
6 单向/双向TLS认证
6.1 单向TLS认证
首先介绍单向TLS认证,即通信的一方验证另一方的身份。
单向TLS认证的一个常见应用场景是:我们通过浏览器访问银行的网页。在这个场景中,我们需要先验证银行的身份(是否正确),(确保身份正确的情况下)然后才敢在这个银行的网页里输入银行账号和密码。
浏览器验证银行的身份的过程如下:
- 在浏览器和银行的HTTPS服务建立安全连接的过程中,银行的HTTPS服务会把它的身份证(身份信息)发给浏览器;
- 浏览器使用内置的CA(Certificate Authority,即证书颁发机构)身份证来验证银行的身份。
当浏览器验证了银行的HTTPS服务的身份之后,银行也会验证浏览器(用户)的身份,过程如下:
- 浏览器展示银行HTTPS服务发来的登录页面;
- 用户在这个页面里输入银行账号和密码,银行的HTTPS服务根据用户输入的信息验证用户的身份。
在上面的两种认证过程中:浏览器对于银行身份的认证过程属于TLS单向认证;而在银行验证用户身份的过程中,银行是通过用户输入的银行账号和密码来验证(用户的身份)的。
6.2 双向TLS认证
有些情况下,通信的双方都是程序(而不是用户),此时,如果让通信的一方输入账号和密码来进行身份认证(如6.1节介绍的那样)的话,在设计和实现上会比较复杂。这种情况下,通常会让双方都通过TLS认证来进行身份认证,尤其是在分布式系统里,有多种类型的程序互相通信时,双向TLS认证会更加简单便捷。
比如在Kubernetes机群里,操作机群的客户端程序kubectl需要验证“Kubernetes master node”(具体的说是“apiserver”)的身份,而后才能放心地把包括敏感信息(比如数据库密码)的计算作业提交给“apiserver”。同时,“apiserver”也需要验证“kubectl”的身份,以确认提交作业的是公司的合法雇员,而不是外贼。
所以,为了实现双向TLS认证,系统中的通信各方都需要有各自的身份证。一个公司可以自签名一个CA身份证,并且用它来给每个雇员以及每个程序签署身份证。这样,只要每台电脑上都预先安装好公司的CA身份证,就可以用这个身份证验证每个雇员和程序的身份了——这也是目前很多公司的常用做法。