SSL双向握手/RSA与ECDHE

本文详细解释了SSL/TLS协议中的双向握手过程,特别关注了RSA和ECDHE两种密钥交换方式,从ClientHello到EncryptedHandshakeMessage,展示了加密套件选择、随机数生成和密钥协商的关键环节。
摘要由CSDN通过智能技术生成

一、SSL双向握手的每一阶段都做了什么(以RSA算法为例)

(一)第一阶段:Client Hello数据包(客户端->服务端)

SSL双向握手整体流程如下图:

Client hello数据包是客户端向服务端发送的初始消息,是SSL双向握手的开始,用来请求建立安全通信信道。该数据包主要包含如下信息:

SSL/TLS 版本:指示客户端支持的最高和最低协议版本。这两个版本号用于在服务器选择协议版本时提供一个范围。(不是把客户端支持的所有版本都列出来

随机数:客户端生成一个随机数,占据32字节,由两部分组成(Unix 时间戳随机字节),包含在 "Client Hello" 消息中。这个随机数在后续用于生成会话密钥、初始化向量生成、非对称密钥交换以及数据完整性保护。

加密算法列表:客户端列出了其支持的加密算法和压缩方法。服务器将从这个列表中选择合适的加密算法和压缩方法。

会话恢复(可选):如果客户端之前与同一服务器建立过 SSL/TLS 会话,并希望重用会话密钥以实现会话恢复(Session Resumption),则可以在 "Client Hello" 中包含会话标识(Session ID)。

(二)第二阶段:Server hello数据包(服务端->客户端)

"Server Hello"是服务器对客户端的"Client Hello"消息作出的响应。在"Server Hello"阶段,服务器选择一个加密套件(Cipher Suite)并协商会话参数,然后向客户端发送包含这些信息的消息。"Server Hello" 消息的主要内容包括:

协议版本号:服务器选择的 SSL/TLS 协议版本号,通常是客户端提供的版本范围内的一个值。

随机数:服务器生成的随机数,用于生成会话密钥、初始化向量生成、非对称密钥交换以及数据完整性保护。

加密套件:服务器从客户端提供的加密套件列表中选择一个支持的加密套件,用于后续的加密和解密操作。加密套件包括加密算法、密钥交换算法等。

压缩方法:服务器从客户端提供的压缩方法列表中选择一个支持的压缩方法,用于后续的数据传输。

会话 ID:如果客户端在 "Client Hello" 中提供了会话 ID,服务器可以选择重用之前的会话状态。在这种情况下,服务器会在 "Server Hello" 中包含相应的会话 ID。

(三)第三阶段:Certificate、Certificate Request、Server HelloDone数据包(服务端->客户端)

1.Certificate数据包

Server Certificate(服务器证书):服务器向客户端发送服务端的数字证书,证书中包含服务器的公钥。该证书由一个受信任的证书颁发机构(CA)签名,用于验证服务器的身份

2.Certificate Request数据包

Certificate Request(客户端证书请求):服务器向客户端发送一个消息,请求客户端提供客户端的数字证书,以便服务器能够验证客户端的身份。通常分为两种使用情况:

双向认证:服务器需要验证客户端的身份,以确保客户端是合法的。

客户端证书认证:服务器希望获取客户端的证书,以便在后续通信中使用客户端的公钥进行加密。(客户端可以选择提供证书以进行身份验证,或者忽略 "Certificate Request" 阶段,继续后续的握手过程。

"Certificate Request" 消息的内容通常包括:

证书类型列表:服务器列出所支持的证书类型,例如 RSA、DSA、ECDSA 等。

摘要算法列表:服务器列出所支持的摘要算法,用于数字签名验证。

可选的 CA 名单:服务器发送一个包含可接受的证书颁发机构(Certificate Authorities,简称CAs)列表的消息,客户端需要从中选择一个合适的数字证书来响应请求。

3.Server Hello Done数据包

"Server Hello Done" 数据包是服务器在发送完"Server Hello"消息后,向客户端发送的一个空消息,用于通知客户端服务器已完成"Server Hello"阶段,并且客户端可以继续握手的下一个步骤。

(四)Certificate、Client Key Exchange、Certificate Verify数据包(客户端->服务端)

1.Certificate数据包

Client Certificate(客户端证书):客户端向服务器发送客户端的数字证书,证书中包含客户端的公钥。该证书由一个受信任的证书颁发机构(CA)签名,用于验证客户端的身份。客户端Certificate数据包的作用有:

身份验证:客户端在 "Certificate" 数据包中包含自己的数字证书,以便服务端验证客户端的身份。数字证书由证书颁发机构(CA)签发,包含了客户端的公钥其他身份信息。服务端可以使用该证书来确认客户端的合法性和真实性。

密钥交换:在某些加密算法中,客户端的数字证书也可以用于密钥交换。例如,在使用基于证书的身份验证的协议(如TLS-RSA和TLS-DHE-RSA)中,服务端的数字证书会包含一个公钥,服客户端可以使用这个公钥来交换临时密钥,用于后续通信的加密。

2.Client Key Exchange数据包

"Client Key Exchange" 数据包用于进行密钥交换。这个数据包包含了客户端生成的临时密钥,用于后续通信的加密和解密。"Client Key Exchange" 数据包的内容取决于所使用的密钥交换算法和加密套件。

在使用RSA密钥交换的情况下,"Client Key Exchange" 会生成第三个随机数(预主密钥)使用服务端公钥加密预主密钥,发送给服务端。这样,服务端接受到后,就可以使用自己的私钥解密并获取临时密钥。

3.Certificate Verify数据包

"Certificate Verify" 数据包用于客户端对给服务端发送的所有握手消息进行数字签名,以证明其拥有客户端的私钥。通过这个数字签名,客户端向服务器证明自己的身份和能力,同时确保握手过程的安全性。

"Certificate Verify" 数据包中包含以下内容:

Signature Algorithm(签名算法):指示用于生成数字签名的算法类型。

Signature(数字签名):这是客户端对握手过程中之前交换的所有数据进行签名的结果。签名是使用客户端的私钥生成的,以证明客户端对其证书的控制权。签名包括握手消息的摘要(通常是SHA-256或其他哈希算法的结果),并使用客户端的私钥进行加密。服务器将使用客户端的证书中的公钥来验证签名的有效性。

Hash Algorithm(哈希算法):指示用于生成消息摘要的哈希算法。

(五)第五阶段:Change Cipher Spec、Encrypted Handshake Message数据包(客户端->服务端)

1.Change Cipher Spec数据包

"Change Cipher Spec" 数据包用于通知接收方在此之后的通信将使用新的加密参数(主密钥)。它是一种非常简单的协议消息,本身不携带任何额外的数据,仅包含一个字节的数值,表示切换到加密状态。

具体来说,"Change Cipher Spec" 数据包的作用如下:

切换加密状态:在握手过程中,双方会协商加密参数,包括加密算法、密钥等。当握手阶段完成后,通过发送 "Change Cipher Spec" 数据包,发送方通知接收方开始使用协商好的加密参数进行数据加密和解密。

握手完成标志:在握手过程的最后,发送 "Change Cipher Spec" 数据包也可以作为握手完成的标志。一旦接收到这个消息,双方都知道握手已经成功完成,加密通信状态已经建立。

2.Encrypted Handshake Message数据包

“Encrypted Handshake Message”数据包:客户端将要发送给服务端的握手消息(在通信双方之间协商参数、进行身份验证、建立安全通道的一系列消息),使用主密钥进行加密,生成 "Encrypted Handshake Message" 数据包。

(六)第六阶段:Change Cipher Spec、Encrypted Handshake Message数据包(服务端->客户端)

1.Change Cipher Spec数据包

与客户端向服务端发送的"Change Cipher Spec" 数据包作用相同,告知客户端服务端已经生成了主密钥,接下来使用新的加密参数(主密钥)进行通信。

2.Encrypted Handshake Message数据包

“Encrypted Handshake Message”数据包:服务端使用主密钥加密的第一个数据,发送给客户端,客户端使用此消息来验证自身主密钥的正确性。

(七)第七阶段:加密通信

握手完成后,双方使用加密信道开始通信。

二、阐述RSA与ECDHE握手中的密钥产生区别

首先分别说明一下RSA和ECDHE的握手流程:

(一)RSA握手流程

1. 客户端Hello:客户端向服务器发送一个随机数,支持的加密套件列表,以及其他的握手信息。

2. 服务器Hello:服务器从客户端提供的加密套件列表中选择一个,并发送自己的证书、一个随机数,以及支持的加密算法和版本。

3. 服务器Key Exchange(可选):如果服务器的证书要求客户端提供一个预主密钥,服务器将发送 "Server Key Exchange" 消息,其中可能包含RSA的公钥(用于加密预主密钥)。

4. 证书请求(可选):如果服务器需要客户端提供证书以进行身份验证,服务器会发送 "Certificate Request" 消息。

5. 服务器Hello Done:服务器通知握手消息的结束,等待客户端响应。

6. 客户端证书和Key Exchange:如果服务器要求,客户端将发送其数字证书以进行身份验证。同时,客户端生成一个随机的Pre-Master Secret,并使用服务器的RSA公钥加密,然后发送给服务器。

7. 握手完成:双方交换 "Change Cipher Spec" 和 "Finished" 消息,表示握手成功完成,通信将切换到加密模式。

(二)ECDHE握手流程

1. 客户端Hello:客户端向服务器发送一个随机数,支持的加密套件列表,以及其他的握手信息。

2. 服务器Hello:服务器从客户端提供的加密套件列表中选择一个,并发送自己的证书、一个随机数,以及支持的加密算法和版本。

3. 服务器Key Exchange(Ephemeral公钥):服务器生成一个临时的椭圆曲线密钥对,将公钥发送给客户端。

4. 服务器Hello Done:服务器通知握手消息的结束,等待客户端响应。

5. 客户端Key Exchange(Ephemeral公钥):客户端也生成一个临时的椭圆曲线密钥对,将公钥发送给服务器。

6. 握手完成:双方交换 "Change Cipher Spec" 和 "Finished" 消息,表示握手成功完成,通信将切换到加密模式。

最后,以上是我个人对RSA握手流程的理解,如果有不对的地方敬请批评指正。

网络方面的知识推荐小林coding的图解网络,不论是学习还是面试准备都很有用!

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值