HTTPS握手过程中的密钥交换是如何进行的?

HTTPS是一种基于响应HTTP的加密传输协议,相比HTTP增加了一层安全保护。在HTTPS建立连接的过程中,密钥交换是非常关键的部分。

以下是HTTPS握手过程中的密钥交换步骤:

  1. 客户端请求连接至服务器,随机生成对称密钥。

客户端(浏览器)通过TCP协议连接到服务器,发送一个ClientHello消息,包含以下信息:

  • 支持的协议版本
  • 支持的加密算法列表
  • 生成的随机数1(Client random)

客户端还会生成一个对称密钥(session key),用于加密通信数据。

  1. 服务端回应,发送密钥协商参数以及证书。

服务端接收到客户端的请求后,发送一个ServerHello消息,包含以下信息:

  • 协商的使用的协议版本
  • 确定使用的加密算法
  • 生成的随机数2(Server random)

此外,服务端还会发送其证书(certificate)供客户端验证其身份。

  1. 密钥协商阶段。

在服务端回应消息中,包含了加密通信数据所需要的密钥协商参数。这些参数中包括:

  • 协商的对称加密算法
  • 协商的密钥交换算法
  • 服务器的公钥(如果协商的是RSA密钥交换算法)

如果协商的是RSA密钥交换算法,则服务端会将信封(EncryptedPreMasterSecret)发送给客户端,这个信封是使用RSA加密的。客户端收到信封之后,使用自己生成的随机数和服务器发送的公钥,解密出对称密钥。服务端和客户端都知道这个共享的对称密钥,以便加密通信数据。

如果协商的是Diffie-Hellman密钥交换算法,那么服务端会发送Diffie-Hellman公钥给客户端,在客户端也发送自己的Diffie-Hellman公钥给服务端。服务端和客户端通过各自的公钥计算出对称密钥,用于加密通信数据。

  1. 握手完成。

客户端自己使用生成的随机数、服务器生成的随机数和共享的对称密钥对一段信息(verify_data)进行加密并发送给服务器,用来检查服务器是否能正确解密数据,如果数据解密正确,密钥交换流程就完成了。

以上是HTTPS握手过程中的密钥交换步骤。

下面我们以RSA密钥交换算法为示例,详细说明一下密钥交换过程。

  1. 客户端请求连接至服务器,随机生成对称密钥。

客户端发送的ClientHello消息如下:

支持的协议版本:TLSv1.2
支持的加密算法列表:ECDHE-RSA-AES128-GCM-SHA256, AES128-SHA256, AES128-SHA, ECDHE-RSA-AES256-GCM-SHA384, AES256-SHA256, AES256-SHA, ECDHE-RSA-AES256-SHA384, ECDHE-RSA-AES128-SHA256, ECDHE-RSA-AES256-SHA, ECDHE-RSA-AES128-SHA
生成的随机数1: 2d 5d 3a 32 7d 12 8b c7 a2 57 4f 4b 40 03 21 ef 1e 35 7f 95 8e c7 1c b6 1f 15 f8 69 f7 a2 67

客户端还会生成一个对称密钥,用于加密通信数据。

session key: e0 fd 7d b7 8e d7 d7 c1 1c 6b 0c ed 7e bd d2 2e
  1. 服务端回应,发送密钥协商参数以及证书。

服务端回应的ServerHello消息如下:

协商的使用的协议版本:TLSv1.2
确定使用的加密算法:ECDHE-RSA-AES128-GCM-SHA256
生成的随机数2:bf 4d 88 64 b1 6a 1e 68 6d ca 91 91 fa 9a 4a d0 d0 92 45 1a 83 8a e1 47 86 28 d0 9b 8c de 38

服务端还发送了自己的证书供客户端验证服务端身份。

  1. 密钥协商阶段。

服务端接收到客户端的请求后,根据客户端的ClientHello信息,确定协商的使用的加密算法为 "ECDHE-RSA-AES128-GCM-SHA256"。同时,也确定了RSA密钥交换算法,服务端会将信封(EncryptedPreMasterSecret)发送给客户端,这个信封使用服务端的公钥进行加密。服务端发送的密钥协商参数如下:

加密通信使用的对称加密算法:AES128-GCM
密钥交换算法:RSA
服务端的RSA公钥:6a 2a 71 38 65 7a 30 47 60 76 c0 8b cd 6b 2c 07 6c a2 2a 55 3d 3d 1e bf 32 b8 56 23 fa ec ba ae b6 26 1b 24 16 57 78 58 fa 87 e8 27 d9 9f bb ac 5d 51 96 d0 1e 57 2c 25 c4 f0 26 4b 4f 99 f4 65 08 8e 85 82 50 86 c5 b2 5f a9 40 3c e5 b5 47 8f 56 1d 57 b5 06 4e 8b ff 4c 1e 82 ec ec 56 eb 82 fc de 60 1f c0 39 17 8f 7d 2a 79 a7 d2 bc 8b 7e 3d 97 c1 17 53

客户端收到服务端发送的密钥协商参数之后,使用服务端发送的公钥,将密文(EncryptedPreMasterSecret)解密出明文(PreMasterSecret)。解密的过程如下:

EncryptedPreMasterSecret: 01 6a a2 7b e8 79 1b 2d 82 c6 4b d0 4e 68 44 92 85 bd e5 fe f0 98 e4 a6 15 58 f2 43 01 19 eb d3 ad 51 88 07 6d 47 dd a7 c0 d1 6c 9b 05 02 88 42 99 52 eb 84 7d 59 1f 29 16 69 3d 1a e8 97 7c fb a3 f5 3d 8d 5f 50 d3 04 67 64 b8 51 02 fc b5 16 ae 4d 4d d4 c4 4b 57 
ServerPublicKey: 6a 2a 71 38 65 7a 30 47 60 76 c0 8b cd 6b 2c 07 6c a2 2a 55 3d 3d 1e bf 32 b8 56 23 fa ec ba ae b6 26 1b 24 16 57 78 58 fa 87 e8 27 d9 9f bb ac 5d 51 96 d0 1e 57 2c 25 c4 f0 26 4b 4f 99 f4 65 08 8e 85 82 50 86 c5 b2 5f a9 40 3c e5 b5 47 8f 56 1d 57 b5 06 4e 8b ff 4c 1e 82 ec ec 56 eb 82 fc de 60 1f c0 39 17 8f 7d 2a 79 a7 d2 bc 8b 7e 3d 97 c1 17 53
PreMasterSecret: 03 03 18 5e 99 d3 5e 22 71 41 3b d5 ee 21 8b 86 08 1b 99 4d 1d 60 4a f0 57 4b 91 8f 0f 92 6b 36

客户端使用解密后的明文PreMasterSecret和刚刚生成的随机数1、随机数2生成一个PreMasterSecret,服务端和客户端都知道这个共享的对称密钥。

PreMasterSecret: 03 03 3c 27 bc 5f c8 40 9e 86 ff 99 1f 77 b4 96 1e 4c 4b 01 96 10 64 b2 f1 99 e6 92 8b a8 7d
  1. 握手完成。

客户端使用生成的随机数、服务器生成的随机数和共享的对称密钥对一段信息verify_data进行加密并发送给服务器。如果服务器成功解密出数据,说明密钥交换流程已经完成。

verify_data: ab 41 63 fa 98 7a 2f d8 e7 22 70 68 7a c0 8c df 60 73 6c 7e 34 96 f0 21 03 4f 18 68 a8 96 9b 2b

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:HTTPS握手过程中的密钥交换是如何进行的? - Python技术站

(0)
上一篇 2023年4月27日
下一篇 2023年4月27日

相关文章

  • SpringBoot返回对象时,如何将Long类型转换为String

    在Spring Boot中,我们有时候需要将Long类型的数据转换为String类型的数据进行返回。可以通过以下方式解决: 自定义转换器 可以通过自定义转换器,来实现Long类型转换为String类型。具体实现如下: @Component public class LongToStringConverter implements Converter<L…

    http 2023年5月13日
    00
  • 503 service unavailable错误解决方案讲解

    当您在访问网站时遇到503 Service Unavailable错误时,这通常意味着服务器无法处理您的请求。以下是解决该问题的攻略,其中包含两个示例: 解决503 Service Unavailable错误 在遇到503 Service Unavailable错误时,可以尝试以下解决方案: 方案1:刷新页面 有时候,503 Service Unavaila…

    http 2023年5月13日
    00
  • OCSP Stapling有什么作用?

    OCSP(Online Certificate Status Protocol)是一种用于验证数字证书是否有效的协议。在TLS(Transport Layer Security)协议的握手过程中,服务器常常需要发送证书以明示身份。OCSP就是为了解决这个问题而被设计的。 在TLS握手过程中,服务器会发送证书链给客户端,客户端需要验证此证书链的有效性。此时,客…

    云计算 2023年4月27日
    00
  • HTTP协议版本不匹配异常的原因是什么?

    HTTP协议版本不匹配异常通常是由于客户端请求中的HTTP协议版本和服务器支持的HTTP协议版本不一致导致的。HTTP协议是Web应用程序之间通信的基础,不同版本的HTTP协议存在一些不同的特性和规范,因此客户端和服务器必须在通信中使用相同的HTTP协议版本才能正确地交互。 当客户端请求中指定的协议版本与服务器支持的协议版本不同,服务器会返回HTTP协议版本…

    云计算 2023年4月27日
    00
  • python用700行代码实现http客户端

    以下是关于“Python用700行代码实现HTTP客户端”的完整攻略: 问题描述 Python是一种流行的编程语言,可以用于编写各种类型的应用程序,包括HTTP客户端。本文将介绍如何使用Python编写一个HTTP客户端,代码行数约为700行。 解决步骤 以下是使用Python写HTTP客户端的步骤: 步骤一:了解问题 首先,需要了解HTTP客户端的基本原理…

    http 2023年5月13日
    00
  • HTTP管道化异常的原因是什么?

    HTTP 管道化是一种优化技术,可以减少 HTTP 的延迟,并提高 Web 应用的性能。但是,当管道化遇到异常时,会导致传输的数据出现混乱或者丢失。这里介绍HTTP管道化异常的原因和解决方法。 HTTP 管道化异常的原因 HTTP 管道化异常的原因主要有以下两点: 服务器无法正确处理管道化的请求 当存在不兼容 HTTP 管道化请求的服务器,就会导致异常。对于…

    云计算 2023年4月27日
    00
  • docker仓库登录及配置insecure-registries的方法

    下面介绍详细的“docker仓库登录及配置insecure-registries的方法”的攻略,包括以下步骤: 步骤一:创建docker注册表 如果没有现成的docker仓库,需要先创建一个docker注册表。 使用以下命令可以创建一个基于HTTP的docker注册表: $ docker run -d -p 5000:5000 –name registry…

    http 2023年5月13日
    00
  • Nginx 代理解决跨域问题多种情况分析

    让我为您详细讲解“Nginx代理解决跨域问题多种情况分析”的完整攻略。 背景 在 web 开发过程中,我们经常会遇到跨域的问题。跨域问题的本质是浏览器的同源策略,即浏览器只允许在同一域名下共享资源。当我们需要访问其他域名下的资源时,会导致跨域。为了解决跨域的问题,我们可以使用 Nginx 反向代理。 Nginx 反向代理 Nginx 是一款高性能的 Web …

    http 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部