HTTPS 证书交换流程

news/2025/2/22 6:03:08

HTTPS 的密钥交换过程是基于 TLS(Transport Layer Security)协议实现的,其核心目标是通过加密和认证机制确保通信双方的安全性。以下是详细的 HTTPS 密钥交换过程的时序图,包括具体加密算法和细节。


HTTPS 密钥交换过程详细时序图

Client Server ClientHello 包含以下内容: - 支持的 TLS 版本 (如 TLS 1.3) - 支持的加密套件列表 (Cipher Suites) - 随机数 (ClientRandom) - 扩展信息 (如 SNI) ServerHello 包含以下内容: - 选定的加密套件 (如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) - 随机数 (ServerRandom) - 服务器证书 (包含公钥) - 可选的 ServerKeyExchange (ECDHE 参数) - ServerHelloDone ClientKeyExchange 客户端发送自己的公钥 (ClientPublicKey) ServerKeyExchange 服务器发送自己的公钥 (ServerPublicKey) 双方计算共享密钥 (SharedSecret): - 客户端: SharedSecret = EllipticCurveMultiply(ServerPublicKey, ClientPrivateKey) - 服务器: SharedSecret = EllipticCurveMultiply(ClientPublicKey, ServerPrivateKey) 使用 PRF 生成会话密钥: MasterSecret = PRF(Pre-MasterSecret, "master secret", ClientRandom + ServerRandom) SessionKeys = PRF(MasterSecret, "key expansion", ClientRandom + ServerRandom) Finished 包含握手消息的哈希值 (使用会话密钥加密) Finished 包含握手消息的哈希值 (使用会话密钥加密) Encrypted Application Data Encrypted Application Data Client Server
1. 客户端发起连接请求

客户端向服务器发送一个 ClientHello 消息,包含以下内容:

  • 支持的 TLS 版本(如 TLS 1.2 或 TLS 1.3)。
  • 支持的加密套件列表(Cipher Suites),例如:
    • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(ECDHE 密钥交换 + RSA 认证 + AES 加密)。
  • 随机数 ClientRandom(用于后续密钥生成)。
  • 可选的扩展信息(如支持的压缩方法、SNI 等)。
Client -> Server: ClientHello
    TLS Version: TLS 1.3
    Cipher Suites: [TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, ...]
    Random: ClientRandom
    Extensions: [SNI, Supported Groups, Signature Algorithms, ...]

2. 服务器响应

服务器收到 ClientHello 后,选择合适的加密套件,并返回 ServerHello 消息,包含以下内容:

  • 选定的加密套件(如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)。
  • 随机数 ServerRandom(用于后续密钥生成)。
  • 服务器证书(包含公钥,用于身份验证)。
  • 可选的 ServerKeyExchange 消息(在某些情况下需要,例如使用 DHE 或 ECDHE 密钥交换时)。
  • 可选的 CertificateRequest 消息(如果需要客户端认证)。
  • ServerHelloDone 消息(表示服务器完成初始握手消息)。
Server -> Client: ServerHello
    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    Random: ServerRandom
    Certificate: ServerCert (包含公钥)
    ServerKeyExchange: (可选,ECDHE 参数)
    ServerHelloDone

3. 密钥交换(ECDHE 示例)

在此阶段,客户端和服务器通过密钥交换算法(如 ECDHE)协商出共享密钥(Pre-Master Secret)。以下是 ECDHE 的具体步骤:

3.1 客户端生成 ECDHE 参数

客户端根据服务器提供的椭圆曲线参数(如 secp256r1),生成自己的临时私钥和公钥:

  • 客户端私钥:ClientPrivateKey
  • 客户端公钥:ClientPublicKey = EllipticCurveMultiply(BasePoint, ClientPrivateKey)

客户端将 ClientPublicKey 发送给服务器。

Client -> Server: ClientKeyExchange
    Public Key: ClientPublicKey
3.2 服务器生成 ECDHE 参数

服务器同样生成自己的临时私钥和公钥:

  • 服务器私钥:ServerPrivateKey
  • 服务器公钥:ServerPublicKey = EllipticCurveMultiply(BasePoint, ServerPrivateKey)

服务器将 ServerPublicKey 发送给客户端。

Server -> Client: ServerKeyExchange
    Public Key: ServerPublicKey
3.3 计算共享密钥

客户端和服务器分别使用对方的公钥和自己的私钥计算共享密钥:

  • 客户端计算:SharedSecret = EllipticCurveMultiply(ServerPublicKey, ClientPrivateKey)
  • 服务器计算:SharedSecret = EllipticCurveMultiply(ClientPublicKey, ServerPrivateKey)

由于椭圆曲线的数学特性,双方计算出的 SharedSecret 是相同的。


4. 生成会话密钥

客户端和服务器使用以下信息生成会话密钥(Master Secret 和对称加密密钥):

  • ClientRandom(客户端随机数)。
  • ServerRandom(服务器随机数)。
  • Pre-Master Secret(通过密钥交换算法协商出的共享密钥)。

通过伪随机函数(PRF,Pseudo-Random Function),生成以下密钥:

  • 加密密钥:用于对称加密(如 AES)。
  • MAC 密钥:用于消息完整性校验(如 HMAC)。
  • IV:用于分组加密模式(如 AES-GCM)。
MasterSecret = PRF(Pre-MasterSecret, "master secret", ClientRandom + ServerRandom)
SessionKeys = PRF(MasterSecret, "key expansion", ClientRandom + ServerRandom)

5. 完成握手

客户端和服务器交换 Finished 消息,验证握手过程是否成功:

  • 客户端发送 Finished 消息,包含握手消息的哈希值(使用会话密钥加密)。
  • 服务器验证客户端的 Finished 消息。
  • 服务器发送自己的 Finished 消息,客户端验证。
Client -> Server: Finished
    Encrypted Hash: HMAC(SessionKeys, HandshakeMessages)

Server -> Client: Finished
    Encrypted Hash: HMAC(SessionKeys, HandshakeMessages)

6. 应用层数据传输

握手完成后,客户端和服务器使用协商出的会话密钥进行对称加密通信。

Client <-> Server: Encrypted Application Data

关键加密算法和细节

步骤加密算法/技术描述
密钥交换ECDHE(Elliptic Curve Diffie-Hellman)使用椭圆曲线密码学生成共享密钥,提供前向安全性(Forward Secrecy)。
身份认证RSA 或 ECDSA服务器证书中的公钥用于验证服务器身份。
对称加密AES-128-GCM使用 AES 加密算法保护应用层数据,GCM 提供加密和完整性保护。
哈希函数SHA-256用于生成消息摘要和伪随机函数(PRF)。
消息完整性HMAC使用 HMAC 算法验证消息完整性。

总结

HTTPS 密钥交换的核心是通过非对称加密(如 ECDHE)协商共享密钥,并使用对称加密(如 AES)保护实际数据传输。整个过程涉及多个加密算法和技术,确保了通信的机密性、完整性和身份认证。


http://www.niftyadmin.cn/n/5861724.html

相关文章

Jenkins整合Jmeter实现接口自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、安装jmeter 下载&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本&#xff0c;启动前修改j…

累加器(Accumulators)在Spark中的应用

累加器&#xff08;Accumulators&#xff09;在Spark中的应用非常广泛&#xff0c;主要用于跨节点的数据共享和统计计算。以下是关于累加器在Spark中应用的详细解释&#xff1a; 一、累加器的定义与特性 定义&#xff1a; 累加器是Spark中提供的一种分布式变量机制&#xff0…

Vmware虚拟机Ubantu安装Docker、k8s、kuboard

准备工作: 切换用户&#xff1a;su root关闭防火墙: sudo ufw diasble关闭swap: systemctl stop swap.target systemctl status swap.target systemctl disable swap.target #开机禁用 systemctl stop swap.img.swap systemctl status swap.img.swap关闭虚拟交换分区 vim /…

JMeter 中实现 100 个用户在 3 秒内并发登录

在 JMeter 中实现 100 个用户在 3 秒内并发登录,需要合理配置线程组、定时器和测试逻辑。以下是具体步骤: 1. 创建测试计划 打开 JMeter。右键点击“Test Plan”,选择 Add > Threads (Users) > Thread Group。 : 设置为 100(模拟 100 个用户)。 : 设置为 3

HTML项目一键打包工具:HTML2EXE 最新版

HTML2EXE 工具可以一键打包生成EXE可执行文件。可以打包任意HTML项目或者是一个网址为单个EXE文件&#xff0c;直接打开即可运行。支持KRPano全景VR项目、WebGL游戏项目、视频播放、,课件打包、网址打包等。 一、功能特点 类别序号功能标题1支持程序图标自定义&#xff08;支持…

一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili HTTP是无状态&#xff08;stateless)协议。也就是说&#xff0c;在一次请求响应结束后&#xff0c;服务器不会留下任何关于对…

新一代MPP数据库:StarRocks

文章目录 1.StarRocks简介2.StarRocks 在数据生态的定位3.StartRocks的使用场景3.1 实时数据仓库3.2 高并发查询3.3 日志与事件分析3.4 物联网&#xff08;IoT&#xff09;数据分析3.5 金融风控与实时监控3.6 数据湖查询加速3.7 A/B 测试与实验分析 4.StarRocks与MySQL比较4.1 …

手动配置 Yum 仓库

在我使用虚拟机&#xff0c;系统在尝试访问CentOS的镜像列表时遇到了网络问题&#xff0c;具体表现为无法解析mirrorlist.centos.org 于是手动配置yum仓库 备份现有的 repo 文件 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 创建新…