TLS协议学习 加密机 数据加密 安当加密

TLS在两个应用程序之间提供安全的数据通信,是数据安全领域非常重要的一个基础协议。对于从事数据安全的工程师,了解乃至掌握协议原理,能够更好地使用标准的协议和算法去支撑数据安全相关业务的实现。本文是TLS协议的一个简介,内容整理自IETF、Baidu、Microsoft。

一、简介

SSL/TLS是为Web浏览器和Web服务器之间的internet事务提供安全HTTP(HTTPS)的协议。

在HTTPS协议中,加密的数据类型包括URL、HTTP头、cookie和通过表单提交的数据。受SSL/TLS保护的网页的URL以“https://”开头。

它也可以用于其他应用程序级协议,如FTP、LDAP和SMTP。

SSL/TLS协议支持通过网络进行服务器身份验证、客户端身份验证、数据加密和数据完整性校验。

SSL由Netscape Communications Corporation于1994年开发,用于保护万维网上的交易安全。

不久之后,IETF开始开发标准协议,以提供相同的功能。SSL 3.0被用作这项工作的基础,称为传输层安全协议(TLS)。

SSL 3.0和TLS 1.0之间有一些细微的区别,一个重要的区别是TLS1.0应用了消息身份验证码密钥散列(HMAC)算法,而SSL 3.0应用了消息身份验证码(MAC)算法。

TLS目前主流的版本是1.2。1.3还是draft状态。

二、使用TLS的优缺点

好处:

1、强大的身份验证、消息隐私和完整性。SSL/TLS的主要功能是能够使用加密保护传输的数据。SSL/TLS还提供服务器身份验证和客户端身份验证(可选),以证明参与安全通信的各方的身份。它还通过完整性检查值提供数据完整性。除了通过加密防止数据泄露外,SSL/TLS安全协议还可用于防止伪装攻击、中间人或桶旅攻击、回滚攻击和重放攻击。

2、互操作性。SSL/TLS适用于大多数Web浏览器和Web服务器。

3、算法的灵活性。SSL/TLS为将在安全会话期间使用的身份验证机制、加密算法和散列算法提供了选项。

4、易用性。应用程序能透明地使用SSL/TLS。SSL/TLS是在应用层下实现的,所以它的大多数操作对客户端来说是完全不可见的。

弊端:

1、密码学,特别是公钥操作,增加CPU负担。最大的开销发生在建立连接时,根据建立连接的频率和持续时间的不同,负载的差别很大。

2、SSL/TLS环境复杂,需要维护;需要系统管理员配置系统并管理证书。

三、协议概览

1、协议组件

SSL/TLS安全协议在应用程序协议层和TCP/IP层之间分层,所以它可以支持多个应用层协议。

SSL/TLS协议可分为两层。第一层是握手协议层,它由三个子协议组成:握手协议、更改密码规范协议和警报协议。第二层是记录协议层。

2、Handshake层

Handshake:

用于在客户端和服务器之间协商会话信息。会话信息包括会话ID、对等证书、要使用的密码规范、要使用的压缩算法以及用于生成密钥的共享密钥。

Change Cipher Spec:

用于更改客户端和服务器之间用于加密的密钥材料。密钥材料是用于创建加密密钥的原始数据。Change Cipher Spec子协议由一条消息组成,该消息告诉SSL/TLS会话中的另一方,也就是已知的对等方,发送方希望更改为一组新的密钥。根据握手子协议交换的信息计算密钥。

Alert:

用于向对等方指示状态变化或错误情况。有各种各样的警报通知对等方正常和错误情况。警报通常在连接关闭、接收到无效消息、消息无法解密或用户取消操作时发送。 

3、Record层

记录层的协议接收并加密来自应用层的数据,并将其传送到传输层。记录协议获取数据,将其分割成适合加密算法的大小,选择性地压缩(或,对于接收到的数据,将其解压缩),应用MAC或HMAC(HMAC仅受TLS支持),然后使用握手协议期间协商的信息加密(或解密)数据。

四、握手协议

握手协议是协商数据传输会话的安全参数的一系列序列消息。下图说明了握手协议中的消息序列。

一、初始的客户端消息

Client Hello:

客户端通过向服务器发送Client Hello消息来启动会话。Client Hello消息包含:

版本号。客户端发送与其支持的最高版本对应的版本号。版本2用于SSL 2.0,版本3用于SSL 3.0,版本3.1用于TLS。尽管用于TLS的IETF RFC是TLS版本1.0,但该协议在版本字段中使用3.1来表示它是比SSL 3.0更高的级别。

随机生成的数据。ClientRandom[32],随机值,是一个4字节的数字,由客户端的日期和时间加上一个28字节随机生成的数字组成,最终将与服务器随机值一起使用,以生成一个主密钥,从中导出加密密钥。

会话标识(如果有)。包含sessionID是为了使客户端能够恢复上一个会话。恢复上一个会话可能很有用,因为创建新会话需要处理器密集型公钥操作,可以通过使用已建立的会话密钥恢复现有会话来避免这些操作。由sessionID标识的先前会话信息存储在相应的客户端和服务器会话缓存中。

密码套件。客户端上可用的密码套件列表。密码套件的一个示例是TLS_RSA_WITH_DES_CBC_SHA,其中TLS是协议版本,RSA是用于密钥交换的算法,DES_CBC是加密算法(在CBC模式下使用56位密钥),SHA是哈希函数。

压缩算法。请求的压缩算法。

二、服务端的响应消息

1、Server hello。

服务器以Server Hello消息进行响应。Server Hello消息包括:

版本号。服务器发送双方支持的最高版本号。

随机生成的数据。ServerRandom[32],随机值,是服务器日期和时间的4字节数字加上随机生成的28字节数字,最终将与客户端随机值一起使用,以生成一个主密钥,从中导出加密密钥。

会话标识(如果有)。这可以是三种选择之一。

New session ID–客户端未指示要恢复的会话,因此生成了一个新ID。当客户端指示要恢复的会话,但服务器不能或不想恢复该会话时,也会生成一个新的会话ID。后一种情况也会产生一个新的会话ID。

Resumed Session ID–该ID与Client Hello中指示的ID相同。客户端指示要恢复的会话ID,服务器愿意恢复该会话。

Null–这是一个新会话,但服务器不愿意在以后恢复会话,因此不返回ID。

密码套件。服务器将选择客户端和服务器都支持的最强密码。如果双方都不支持密码套件,会话将以“握手失败”警报结束。

压缩算法。指定要使用的压缩算法。

2、Server Certificate. 

服务器将其证书发送到客户端。服务器证书包含服务器的公钥。客户端将使用此密钥对服务器进行身份验证并加密premaster key。客户端还检查证书中服务器的名称,以验证它是否与用于连接的客户端的名称匹配。

3、Server Key Exchange. 

这是一个可选步骤,在该步骤中,服务器创建临时密钥并将其发送到客户端。客户端可以使用此密钥在稍后的过程中加密客户端密钥交换消息。仅当公钥算法未提供加密客户端密钥交换消息所需的密钥材料时,例如当服务器的证书不包含公钥时,才需要执行该步骤。

4、Client Certificate Request.

这是一个可选步骤,其中服务器请求对客户端进行身份验证。此步骤可用于服务器必须在提供敏感信息之前确认客户端身份的网站(如银行网站)。服务器

5、Server Hello Done. 

此消息表示服务器已完成,正在等待客户端的响应。

三、客户端给服务器的响应

1、Client Certificate.

如果服务器发送了客户端证书请求,则客户端会将其证书发送到服务器以进行客户端身份验证。客户端的证书包含客户端的公钥。

2、Client Key Exchange. 

客户端在使用两个随机值计算premaster key后发送客户端密钥交换消息。premaster key在传输到服务器之前由服务器证书中的公钥加密。双方将在本地计算主密钥并从中派生会话密钥。

如果服务器可以解密此数据并完成协议,则客户端将确保服务器具有正确的私钥。这一步对于证明服务器的真实性至关重要。只有私钥与证书中的公钥匹配的服务器才能解密此数据并继续协议协商。

此消息还将包括协议版本。服务器将验证它是否与客户端hello消息中发送的原始值匹配。此措施可防止回滚攻击。回滚攻击通过操纵消息来工作,以使服务器和客户端使用不太安全的早期版本的协议。

3、Certificate Verify.

仅当客户端以前发送了客户端证书消息时,才会发送此消息。客户端通过使用其私钥对到目前为止所有消息的哈希进行签名来进行身份验证。接收方使用签名者的公钥验证签名,从而确保签名是使用客户端的私钥签名的。

4、Change Cipher Spec.

此消息通知服务器,客户端完成消息之后的所有消息将使用刚才协商的密钥和算法进行加密。

5、Client Finished. 

此消息是整个对话的散列,以提供客户端的进一步身份验证。此消息是记录层加密和散列的第一条消息。

四、服务器对客户端的最终响应。

1、Change Cipher Spec Message. 

此消息通知客户端服务器将开始使用刚刚协商的密钥加密消息。

2、Server Finished Message. 

此消息是到目前为止使用会话密钥和MAC密钥的整个交换的散列。如果客户端能够成功解密此消息并验证包含的哈希,则可以确保SSL/TLS握手成功,并且客户端计算机上计算的密钥与服务器上计算的密钥匹配。

五、警报子协议

警报子协议是握手协议的一个组件,其中包括可从任何一方发送的事件驱动警报消息。在发出警报消息后,会话结束,或者收件人可以选择是否结束会话。警报在RFC 2246中的TLS规范中定义。

猜你喜欢

转载自blog.csdn.net/weixin_51174449/article/details/124486166