TLS中ChangeCipherSpec为什么是个单独的协议类型【转】

 发表于 2020-03-14 22:27 |  更新于 2021-04-29 17:15

RFC5246中说:

Note: To help avoid pipeline stalls, ChangeCipherSpec is an independent TLS Protocol content type, and is not actually a TLS handshake message.

为了避免pipeline stall,ChangeCipherSpec是个单独的协议类型,不属于握手协议。这里什么是pipeline stall?

1. pipeline stall

通俗点的理解是,在CPU流水线设计中,有些指令必须在某些指令之后执行,中间需要停顿一下,等待前一个指令执行完,才能开始后一个指令;或者逻辑分支时,需要控制程序指令转移,导致流水线停顿。如果这样的stall过多,就会影响的性能。可以采取一些办法减少或避免停顿。

2. TLS1.2及之前的ChangeCipherSpec

为什么ChangeCipherSpec需要是单独的类型呢?如果是握手协议类型,TLS协议规定相同协议类型的数据可以集中到一个record中发送,也就是说,一个record中可以同时存放ClientKeyExchange,ChangeCipherSpec,Finished这三个消息,其中ClientKeyExchange,ChangeCipherSpec这两个是不加密的,Finished是需要加密的。但TLS的加密是以record为单位的,一个record只能加密或不加密,不能其中一部分数据加密,另一部分不加密。所以在实现的时候,必须将Finished放入一个单独的record中,另外,在ChangeCipherSpecFinished之间,也需要将连接状态从明文状态转换到加密状态,就需要停顿一下。

但是,并不一定每个实现都能很好的遵循”将Finished放入单独的record中发送”这个约定,这样就在协议设计的时候添加了这样的冗余,相当于使用ChangeCipherSpecClientKeyExchangeFinished强制分配到两个record中。

3. TLS1.3的ChangeCipherSpec

TLS1.3中并不需要该消息,因为协议本身保证了在状态转换前发送的消息都是确定的,比如握手消息在ClientHello, ServerHello之后都是加密的,应用消息在发送完Finished之后也都是加密的,而且TLS1.3的秘钥推导跟之前版本的也都不一样,不需要CCS这样的冗余设计。但为了兼容性,还是保留了一些。

4. 总结

ChangeCipherSpec是TLS1.2及之前的协议设计的冗余消息,目的是从协议上避免实现时的流水线停顿问题。

参考

  1. pipeling stall
  2. CCS pipeling stall
  3. OpenSSL再曝CCS注入漏洞
<think>嗯,用户让我介绍一下TLS握手协议。首先,我需要回想一下TLS的基础知识。TLS是传输层安全协议,用于加密网络通信,对吧?握手协议是TLS建立安全连接的过程。那用户可能想了解整个过程的具体步骤,以及每个步骤的作用。 用户可能是开发人员,或者是学习网络安全的学生,他们需要了解TLS的工作原理,可能用于配置服务器或者解决连接问题。我需要确保解释清晰,结构合理,并且符合他们提到的格式要求,比如行内公式用$...$,独立公式单独成段用$$...$$,但暂时没想到需要用到数学公式的地方,不过要注意如果有的话要正确应用。 首先,我应该分步骤介绍握手过程,比如从客户端发起请求开始,然后服务器响应,密钥交换,生成会话密钥等。每个步骤可能需要详细说明使用的算法和目的,比如非对称加密、对称加密、证书验证等。 还要注意用户提到的系统级指令,比如使用中文,结构清晰,分步解答。可能需要检查是否有技术术语需要进一步解释,比如“密码套件”或“前向保密”。此外,确保回答真实可靠,避免错误的信息,比如TLS版本之间的差异,比如TLS 1.2和1.3的区别是否需要提及? 可能用户没提到版本,但为了全面性,可以简要说明不同版本的握手过程是否有变化,比如TLS 1.3简化了握手步骤。不过这可能超出用户的问题范围,但作为扩展可能有帮助。需要平衡深度和广度,不要太过深入,但覆盖关键点。 接下来,我应该组织内容,首先定义TLS握手协议,然后分步骤解释流程,每个步骤的作用,可能涉及的加密技术,最后总结握手的目标。此外,可能需要提到证书验证和密钥生成的过程,比如如何通过预主密钥生成会话密钥。 需要确保每个部分逻辑连贯,例如: 1. 客户端发起ClientHello,包含支持的TLS版本、密码套件、随机数。 2. 服务器响应ServerHello,选择参数,发送证书。 3. 密钥交换,比如RSA或Diffie-Hellman。 4. 生成会话密钥,切换加密方式。 5. 完成握手,开始加密通信。 同时,需要解释每个步骤的安全目的,比如随机数防止重放攻击,证书验证身份,密钥交换确保密钥安全传输,会话密钥用于对称加密提高效率。 可能还需要提到前向保密(PFS),比如使用Diffie-Hellman临时密钥,这样即使长期密钥泄露,过去的通信也不会被解密。这点在TLS 1.3中成为强制要求,但可能在之前的版本中是可选的。 最后,检查是否有遗漏的关键点,比如握手失败的可能原因,比如证书不信任、算法不匹配等,但用户的问题可能不需要这些,但作为扩展可能会有帮助。不过根据用户的问题,可能只需要核心流程的介绍。 总结,结构应该是:简介、步骤详解(分点)、关键机制(如证书、密钥交换、加密套件)、握手目标,可能加上版本差异的注释。确保使用清晰的中文,避免技术术语堆砌,适当解释术语,但保持专业性。</think>TLS(Transport Layer Security)握手协议是建立加密通信通道的核心过程,主要分为以下步骤: --- ### 一、握手目标 1. **身份验证**:验证服务器(或客户端)的身份。 2. **协商参数**:确定加密算法(如`AES`)、密钥交换算法(如`ECDHE`)、哈希算法(如`SHA-256`)等。 3. **生成密钥**:通过安全方式生成会话密钥,用于后续对称加密。 --- ### 二、详细流程(以TLS 1.2为例) 1. **ClientHello** - 客户端发送: - 支持的TLS版本 - 支持的密码套件(如`TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256`) - 客户端随机数(`Client Random`) 2. **ServerHello** - 服务器响应: - 选定的TLS版本和密码套件 - 服务器随机数(`Server Random`) - 服务器数字证书(包含公钥) 3. **证书验证** - 客户端验证服务器证书的合法性(如颁发机构、有效期等)。 4. **密钥交换** - **非对称加密阶段**: - 客户端生成预主密钥(`Pre-Master Secret`),用服务器公钥加密后发送。 - 或通过`Diffie-Hellman`算法协商共享密钥(支持前向保密)。 5. **生成会话密钥** - 客户端和服务器分别通过以下参数生成相同的会话密钥: $$ \text{会话密钥} = \text{PRF}(\text{Pre-Master Secret}, \text{"key expansion"}, \text{Client Random} + \text{Server Random}) $$ (`PRF`为伪随机函数) 6. **切换加密模式** - 双方发送`Change Cipher Spec`通知,后续通信使用会话密钥加密。 7. **握手完成** - 交换`Finished`消息验证握手过程未被篡改。 --- ### 三、关键机制 1. **前向保密(Forward Secrecy)** - 使用临时密钥(如`ECDHE`),即使长期私钥泄露,历史会话也无法解密。 2. **证书体系** - 依赖CA(证书颁发机构)链式信任,确保服务器身份可信。 3. **降级攻击防护** - 通过随机数和签名防止攻击者强制使用弱加密算法。 --- ### 四、TLS 1.3的改进 - **简化握手**:从2-RTT减少到1-RTT(甚至0-RTT)。 - **废弃不安全算法**:移除RSA密钥交换、SHA-1等。 - **密钥交换与认证合并**:提升效率与安全性。 --- ### 五、总结 TLS握手通过非对称加密建立信任,再为高效对称加密,平衡安全性与性能。理解其流程有助于调试HTTPS问题、配置服务器及分析网络安全事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值