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