SSL/TLS简介

本文主要介绍SSL/TLS的相关知识。

1. 概述

SSL(Secure Sockets Layer)及其继任者 TLS(Transport Layer Security)是为网络通信提供安全及数据完整性的一种安全协议。

SSL 由 Netscape 研发,用以保障在 Internet 上安全地进行数据传输,利用数据加密(Encryption)技术,可确保数据在网络上的传输过程中不会被截取或窃听。SSL 当前版本为3.0,它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输场景中。

TLS 用于在两个通信应用程序之间提供保密性和数据完整性。

TLS 与 SSL 在传输层对网络连接进行加密。

2. 作用

1. 认证用户和服务器,确保数据被发送到正确的客户端和服务器上;

2. 加密数据以防止数据中途被窃取;

3. 维护数据的完整性,确保数据在传输过程中不被篡改。

3. SSL的工作过程

3.1 发送方的工作过程

1. 从上层接收要发送的数据(包括各种消息和数据);

2. 对接收的数据进行分段,分成若干纪录;

3. 使用指定的压缩算法进行数据压缩(可选);

4. 使用指定的 MAC 算法生成 MAC ;

5. 使用指定的加密算法进行数据加密

6. 添加 SSL 记录协议的头,发送数据。

3.2 接收方的工作过程

1. 接收数据,从 SSL 记录协议的头中获取相关信息;

2. 使用指定的解密算法解密数据

3. 使用指定的 MAC 算法校验 MAC ;

4. 使用压缩算法对数据解压缩(在需要进行);

5. 将若干记录进行数据重组;

6. 将重组后的数据发送给高层。

说明: 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)是 SSL 或 TLS 作为HTTP应用层子层的一种传输协议。

HTTPS 由 Netscape 开发并内置于其浏览器中的,用于对数据进行压缩和解压操作,并返回由网络上传送的结果。 HTTPS 实际上应用了 Netscape 的 SSL 作为HTTP应用层的子层。 HTTPS 使用端口 443 ,而不是像 HTTP 那样使用端口 80 来进行TCP/IP 通信的。

HTTPS 是以安全为目标的 HTTP 通道,可简单理解为 HTTP 的安全版。HTTPS 是在 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL ,因此加密的相关内容需要了解 SSL。

6. 双向TLS认证

6.1 TLS单向认证

首先介绍单向TLS认证,即通信的一方验证另一方的身份。

单向TLS认证的一个常见应用场景是: 我们通过浏览器访问银行的网页。首先,我们需要验证银行的身份证, 然后才敢在这个银行的网页里输入银行账号和密码。

浏览器验证银行的身份证的过程如下:

1. 在浏览器和银行的HTTPS服务建立安全连接的过程中,银行的HTTPS服务会把它的身份证发给浏览器;

2. 浏览器使用内置的CA的身份证来验证银行的身份证。

当浏览器验证了银行的HTTPS服务的身份之后,银行也会验证浏览器(用户)身份,过程如下:

1. 浏览器展示银行HTTPS服务发来的登录页面;

2. 用户在这个页面里输入银行账号和密码,银行的HTTPS服务根据用户输入的信息验证用户的身份。

在上面的两种认证过程中:浏览器对于银行身份证的认证,该认证过程是TLS单向认证;而银行验证用户身份的过程中,用户的身份是通过我们输入的银行账号和密码来验证的。

6.2 TLS双向认证

有些情况下,通信的双方都是程序(而不是人),此时,如果让通信的一方输入账号和密码来进行身份认证(如6.1节中介绍的那样)的话,在设计和实现上会比较复杂,这时,我们通常会让双方都通过 TLS 身份证来进行身份认证,尤其是在分布式系统里,有多种类型的程序互相通信时,双向TLS认证更加显得简单便捷。

比如在 Kubernetes 机群里,操作机群的客户端程序 kubectl 需要验证 Kubernetes master node(具体的说是 apiserver)的身份,才能放心地把包括敏感信息(比如数据库密码)的计算作业提交给 apiserver。同时,apiserver 也需要验证 kubectl 的身份,以确认提交作业的是公司的合法雇员,而不是外贼。

所以,为了实现双向TLS认证,系统中的通信各方都需要有各自的身份证。一个公司可以自签名一个CA身份证,并且用它来给每个雇员以及每个程序签署身份证。这样,只要每台电脑上都预先安装好公司的CA身份证,就可以用这个身份证验证每个雇员和程序的身份了。这是目前很多公司的常用做法。


猜你喜欢

转载自blog.csdn.net/liitdar/article/details/80737950