SSL/TLS握手过程

本文介绍了SSL/TLS协议的发展历程及其在网络通信中如何保障数据的安全性。详细解释了SSL/TLS如何通过加密技术、消息完整性和身份验证来防止偷听、篡改及假冒等问题,并概述了SSL/TLS的握手过程。

一、SSL/TLS简介

SSL(Secure Socket Layer)最初是由Netscape公司开发的一个协议,其目的在于为互联网提供一个安全的通信机制。Netscape最早对外公布的版本是SSL2.0,但是由于SSL2.0有一些安全方面的缺陷,所以后来又重新设计了SSL3.0。SSL后来被IETF(Ineternet Engineering Task Force)所采纳并重新命名为TLS(Transport Layer Security),也就是说,TLS其实是SSL的后续版本。TLS1.0是SSL3.0的一个升级版本,后续的小版本还有TLS1.1和TLS1.2。现在普遍使用的是SSL3.0或者TLS1.0。

SSL/TLS协议是位于应用层和传输层(如TCP)之间的,它和具体的应用层协议无关,也就是说,任何应用层协议都可以使用SSL/TLS来获得安全通信的能力,如HTTP/FTP/SMTP等。

二、SSL/TLS基本原理

我们知道,互联网本身是一个公共的、不安全的网络。数据在互联网上传输时,无法避免会被恶意的第三方监视、偷听、截获甚至篡改,更有甚者,正在和我们通信的对方有可能根本就是假冒的,比如钓鱼网站等。既然SSL/TLS要为互联网提供一个安全通信的机制,那么它必须解决这里所有提到的安全问题,具体说,SSL/TLS通过下面三个方面来为互联网通信提供安全保证。

1. 机密性保证

SSL/TLS对要传输的数据进行加密,这样在互联网的传输数据就是加密后的密文,即使被恶意的第三方监视和偷听,由于没有解密秘钥,所以无法理解密文的意思。这也称为SSL/TSL的防偷听机制。

加密分为对称加密和非对称加密。对称加密(AES/RC4/3DES)的优点是效率高,然而对称加密使用的加密解密秘钥是一样的,这意味着加密方(即发送方)必须把秘钥发送给接收方,显然,在传输秘钥的过程中,如果不加以保护,秘钥就会被泄露。非对称加密(RSA/ECC)则克服了对称加密需要传输秘钥的弱点,但是非对称加密的效率很低,如果传输的数据量很大,那么使用非对称加密将是十分耗时的。也就是说,无论是对称加密还是非对称加密,都不能很好地满足数据加密传输的要求,为此,SSL/TLS对这两种方法取长补短,综合应用。SSL/TLS利用非对称加密来交换秘钥信息(秘钥信息并不是秘钥,而是生成秘钥时所需要用到的信息),由于秘钥信息的数据量很少,使用非对称加密还是可以接受的。而对于要传输的数据,SSL/TLS则使用对称加密,其秘钥由前面使用非对称加密传输得到的秘钥信息生成。由于秘钥信息是使用非对称加密的,所以其在传输过程中是安全的(恶意的第三方没有私钥无法进行解密)。

2. 消息完整性保证

由于恶意的第三方能够截获传输中的数据并把数据篡改后再发给接收方,所以SSL/TLS还必须提供一种方法来检测数据是否被篡改过。这也称为SSL/TLS的防篡改机制。具体地说,SSL/TLS使用MAC(消息验证码)来实现防篡改,即在发送消息之前,把该消息和一个通信双方共享的秘钥作为一个hash算法(MD5/SHA1)的输入,再把由此求得的摘要值联通消息一起发送给对方。

3. 身份真实性保证

SSL/TLS通过验证身份来确保不会和假冒的对方通信。这也称为SSL/TLS的防假冒机制。SSL/TLS使用由私钥签名的数字证书来实现防假冒。一般来说,服务器需要把它的数字证书传给客户端来验证,而客户端不一定需要提供证书。

三、SSL/TLS的握手过程

在开始传输应用程序数据之前,通信的双方必须先进行SSL/TLS握手。在握手的过程,双方交换并协商重要的信息,包括将要使用的SSL/TLS协议版本、加密算法、MAC算法、验证算法,以及用于各种算法的秘钥等。当然,任一方都可以在握手的过程中来验证对方的真伪,一旦验证失败,握手过程将被终止,同时这个SSL/TLS连接也会被终止。具体说,SSL/TLS的握手过程可以分为三个阶段:参数协商、身份验证,以及秘钥交换。

1. 参数协商

在这个阶段,客户端和服务器确定一个双方都能支持的最高版本的SSL/TLS协议,同时确定它们所使用的算法组合(Cipher Suite)。算法组合是分别用于不同目的的三个算法的组合,包含用于交换秘钥(Key Exchange)和身份验证的算法,用于加密应用程序数据的对称加密算法,以及用于消息验证的MAC算法。在SSL/TLS中,一个算法组合可以用一个字符串来表示,如“TLS_RSA_WHIT_RC4_128_MD5”,这个算法组合表示使用RSA来交换秘钥和验证身份,使用RC4来加密应用程序数据,以及使用MD5来验证消息内容(即防篡改)。另外,在这个阶段中,客户端和服务器会分别产生一个随机数,然后把其传给对方,它们将会在后面的秘钥交换阶段中用到。

2. 身份验证

如果在参数协商阶段时所确定的算法组合要求进行身份验证(如RSA),则服务器需要提供信息(服务器证书)来让客户端对齐进行身份验证。反过来,服务器也可以要求客户端提供证书,以便服务器也能够验证客户端的身份,不过这并不是必须的。是否需要验证客户端主要是根据应用程序的要求。

3. 密钥交换

在身份验证通过以后,就可以进入密钥交换阶段。注意,在这个阶段,客户端和服务器并不是直接交换秘钥,而是交换生成秘钥所需要用的信息,这个信息被称为Pre-Master Secret,其实就是一个有客户端产生的随机数。如果在参数协商阶段时所确定的算法组合指明使用RSA来交换秘钥,那么客户端将使用服务器的公钥(包含在服务器的数字证书中)来加密这个Pre-Master Secret,然后再传给服务器,由于只有服务器才有私钥来进行解密,所以Pre-Master Secret的传输是安全的。有了Pre-Master Secret之后,客户端和服务器还需要再计算一个Master Secret,这是因为最终的秘钥都是基于Master Secret而生成的。Master Secret本身则是通过对三个随机数进行计算而得到的,除了Pre-Master Secret之外,另外两个随机数则是在参数协商阶段交换的客户端随机数和服务器随机数。

最终生成的秘钥一共有4个,分别是:

  • 客户端MAC写入秘钥。客户端使用这个秘钥来计算将要发送的消息的摘要,服务器使用该秘钥来验证客户端发过了的消息,也即实现防篡改。
  • 服务器MAC写入秘钥。服务器使用这个秘钥来计算将要发送的消息的摘要,客户端使用该秘钥来验证服务器发过来的消息。
  • 客户端写入秘钥。客户端使用这个秘钥来加密将要发送的应用程序数据,服务器使用它来对收到的密文进行解密。
  • 服务器写入秘钥。服务器使用这个秘钥来加密将要发送的应用程序数据,客户端使用它来对收到的密文进行解密。
下面结合对www.sogou.com的抓包,具体看着三个阶段中的各个步骤:
总览:

  1. 客户端发送一个ClientHello消息给服务器,该消息包含客户端所能支持的SSL/TLS最高版本,以及一个支持的算法组合列表,当然,还有客户端生成的随机数。
  2. 服务器给客户端发送一个ServerHello消息,该消息包含服务器所选择的SSL/TLS版本号以及算法组合,同时还有服务器产生的随机数
  3. 如果在步骤2中所选择的算法组合包含RSA,则服务器向客户端发送它的数字证书,客户端将会验证服务器的身份。
  4. 服务器向客户端发送ServerHelloDone消息,表示服务器完成协商阶段的工作。
  5. 客户端产生一个随机的Pre-Master Secret,然后想服务器发送一个ClientKeyExchange消息,该消息包含使用服务器公钥加密的Pre-Master Secret
  6. 客户端和服务器各自使用Pre-Master Secret,步骤1中产生的客户端随机数,以及步骤2中产生的服务器随机数来计算一个Master Secret。有了Master Secret之后,客户端和服务器就可以使用Master Secret来计算后面所有需要用到的秘钥。
  7. 客户端发送一个ChangeCipherSpec通知给服务器,表明客户端将要开始使用刚才生成的秘钥来加密和验证数据。最后,客户端发送一个ClientFinish消息。
  8. 服务器收到了客户端的ChangeCipherSpec通知之后,也会对客户端发送ChangeCipherSpec通知,最后,服务器发送一个ClientFinish消息。
在完成握手之后,就可以使用握手过程中所生成的秘钥来加密应用程序数据以及验证消息了。





参考资料:《Visual C++网络编程》

<think>好的,用户现在想详细了解SSL/TLS握手过程的步骤以及加密套件在其中的作用。之前我已经回答过类似的问题,但这次用户明确要求更详细的步骤和加密套件的具体应用阶段。我需要结合之前的回答和引用内容,整理出一个结构清晰的解释。 首先,用户提到参考了站内的三个引用,分别是关于握手过程详解、抓包分析和TLS/SSL握手的学习笔记。这些引用涵盖了握手的历史发展、步骤概览、密钥交换、身份验证等,还有实际抓包的建议。用户的上一次回答已经分阶段说明了加密套件的使用,现在需要更详细的步骤,并突出加密套件的作用。 我需要确定SSL/TLS握手的主要步骤,通常包括Client Hello、Server Hello、证书交换、密钥交换、生成会话密钥等。同时,要明确每个步骤中加密套件的哪个部分被使用,比如密钥交换算法在Server Key Exchange阶段,身份验证在证书验证阶段等。 用户可能对TLS 1.2和1.3的区别感兴趣,但问题中没有明确提到,所以可能需要简要提及,但重点还是放在通用步骤上。另外,用户之前的回答已经提到过前向保密,这里可能需要关联到密钥交换算法如ECDHE。 需要确保每个步骤都对应到加密套件的组件,比如TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256中的各个部分如何在不同阶段应用。同时,引用中的资料提到证书验证、密钥交换、对称加密的应用阶段,这些都需要整合到回答中。 还要注意用户希望详细步骤,所以可能需要分点详细描述每个阶段,比如将握手过程分为6个步骤,每个步骤说明做了什么,加密套件的哪部分参与其中。例如,Client Hello发送支持的加密套件列表,Server Hello选择具体的套件,之后证书验证使用身份验证算法,密钥交换使用密钥交换算法等。 另外,用户可能对实际应用中的例子或抓包分析感兴趣,但问题主要集中在理论步骤,所以可以简要提到抓包工具如Wireshark,但不需要深入。最后,生成的相关问题需要考虑用户可能进一步想了解的内容,比如密钥交换算法选择的影响,如何验证证书,或者不同TLS版本的区别。 需要确保回答结构清晰,分步骤说明,并在每个步骤中明确加密套件的作用。同时,引用之前的引用资料,比如在证书验证阶段引用[^1]和[^3],在密钥交换阶段引用[^4]和[^3]等。保持语言简洁,技术细节准确,避免错误。</think>以下是SSL/TLS握手过程的**详细步骤**及**加密套件在各阶段的核心作用**,结合技术实现和协议规范进行分层解析: --- ### 一、SSL/TLS握手全流程详解(以TLS 1.2为例) #### 1. **Client Hello** - **功能**:客户端发起握手,声明能力 - 发送支持的TLS版本(如TLS 1.2) - 生成客户端随机数(Client Random) - 列出**支持的加密套件列表**(如`TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256`)[^1] - 提供支持的压缩方法(可选) #### 2. **Server Hello** - **功能**:服务器确认协议参数 - 选择双方兼容的TLS版本 - 生成服务端随机数(Server Random) - 从客户端列表中选择**一个加密套件**(如上述ECDHE-RSA套件) - 确定是否启用会话恢复(Session ID)[^1] #### 3. **Certificate Exchange** - **功能**:身份验证 - 服务器发送数字证书链(包含公钥),证书签名算法由加密套件的**身份验证算法**决定(如RSA)[^3] - 客户端验证证书合法性(CA链、有效期、吊销状态) #### 4. **Server Key Exchange** - **功能**:传递密钥交换参数 - 当使用**临时密钥交换算法**(如ECDHE)时,服务器发送: - 椭圆曲线参数(如命名曲线secp256r1) - 服务端临时公钥(Server Params) - 使用证书私钥对参数签名(RSA签名)[^1] #### 5. **Client Key Exchange** - **功能**:完成密钥协商 - 客户端根据服务器参数生成临时公钥(Client Params) - 若使用RSA密钥交换,客户端直接生成预主密钥(Pre-Master Secret)并用服务器公钥加密传输[^3] #### 6. **Finished** - **功能**:验证握手完整性 - 双方根据预主密钥、Client/Server Random生成主密钥(Master Secret) - 用主密钥派生出**对称加密密钥**(如AES-128)和**MAC密钥**(如HMAC-SHA256) - 交换加密后的Finished消息验证握手数据完整性 --- ### 二、加密套件在各阶段的具体应用 以`TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256`为例: | 组件 | 作用阶段 | 技术实现 | |----------------------|---------------------------|--------------------------------------------------------------------------| | **ECDHE**(密钥交换) | Server/Client Key Exchange | 通过临时椭圆曲线参数生成预主密钥,实现前向保密 | | **RSA**(身份验证) | Certificate Exchange | 验证服务器证书签名,确保公钥真实性[^3] | | **AES_128_GCM** | Application Data | 加密HTTP数据,GCM模式同时提供机密性和完整性校验 | | **SHA256** | Finished & MAC | 生成主密钥时用于PRF函数,并作为HMAC算法验证数据完整性[^1] | --- ### 三、关键协议消息流程图 ```plaintext Client Server |-----Client Hello---------------------->| |<----Server Hello-----------------------| |<----Certificate------------------------| # RSA身份验证 |<----Server Key Exchange----------------| # ECDHE参数传递 |-----Client Key Exchange--------------->| # 客户端临时公钥 |-----Change Cipher Spec---------------->| # 切换加密模式 |-----Finished-------------------------->| # 验证握手数据 |<----Change Cipher Spec-----------------| |<----Finished---------------------------| |-----Application Data------------------>| # AES-GCM加密数据 ``` --- ### 四、TLS 1.3的优化改进 1. **加密套件简化**:删除不安全算法(如RSA密钥交换),强制使用前向保密(仅支持ECDHE)[^1] 2. **1-RTT握手**:通过预共享密钥(PSK)或0-RTT模式减少交互次数 3. **密钥分离**:明确区分握手密钥与应用数据密钥,增强安全性 --- ### 五、抓包验证建议 通过Wireshark抓包可观察到: - `Client Hello`中的`Cipher Suites`字段(如截图) - `Server Hello`中选定的加密套件 - `Server Key Exchange`中的ECDHE参数(十六进制值)[^2] ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值