SSL/TLS

news/2024/9/17 21:32:42/ 标签: github

SSL/TLS 握手的全部步骤

  1. 客户端 Hello(Client Hello)

    • 客户端向服务器发送 Client Hello 消息,包含以下信息:
      • 支持的 SSL/TLS 版本(例如 TLS 1.2 或 TLS 1.3)
      • 支持的加密套件(cipher suites)
      • 支持的压缩方法(compression methods)
      • 客户端生成的随机数(client random)
      • 会话 ID(如
      • V果是重新连接)
  2. 服务器 Hello(Server Hello)

    • 服务器响应 Client Hello,发送 Server Hello 消息,包含以下信息:
      • 服务器选择的 SSL/TLS 版本
      • 服务器选择的加密套件
      • 服务器选择的压缩方法
      • 服务器生成的随机数(server random)
      • 会话 ID(如果是重新连接)
  3. 服务器证书(Server Certificate)

    • 服务器发送其数字证书(包含公钥和由 CA 签名的信息)给客户端。这是用于客户端验证服务器身份的重要步骤。
  4. 服务器密钥交换(Server Key Exchange)

    • 如果服务器选择的加密套件需要额外的密钥交换信息(例如使用 Diffie-Hellman 密钥交换),服务器会发送密钥交换消息。这包括服务器生成的密钥交换参数。
  5. 服务器 Hello Done

    • 服务器发送 Server Hello Done 消息,标志着服务器端的握手消息发送完毕。
  6. 客户端证书(Client Certificate)

    • 如果服务器要求客户端进行身份验证,客户端会发送其数字证书。此步骤是可选的,取决于服务器的要求。
  7. 客户端密钥交换(Client Key Exchange)

    • 客户端生成一个预主密钥(pre-master secret),用服务器的公钥加密后发送给服务器。这个密钥用于生成会话密钥。
  8. 证书验证(Certificate Verify)

    • 如果客户端提供了证书,它会用私钥对之前的所有握手消息进行签名,证明其身份。
  9. 客户端 Finished

    • 客户端发送 Change Cipher Spec 消息,通知服务器后续消息将使用协商的加密套件进行加密。接着发送 Finished 消息,验证之前的握手消息没有被篡改。
  10. 服务器 Finished

    • 服务器收到客户端的 Finished 消息后,发送 Change Cipher Spec 消息,通知客户端服务器也将使用协商的加密套件进行加密通信。接着发送 Finished 消息,验证握手过程中的消息没有被篡改。
  11. 数据传输

    • 握手完成后,客户端和服务器使用协商的会话密钥进行加密数据传输。

密钥的组成、生成及验证

1. 预主密钥的生成和使用

  • 生成: 预主密钥(pre-master secret)是由客户端生成的一个随机值。在客户端的密钥交换消息中,客户端生成一个随机的预主密钥,并使用服务器的公钥对其进行加密。加密后的预主密钥被发送给服务器。

  • 解密: 服务器使用其私钥解密预主密钥,恢复原始值。

2. 会话密钥的生成

  • 生成: 会话密钥由客户端和服务器基于预主密钥和握手过程中交换的随机数(client random 和 server random)生成。具体步骤如下:
    • 使用伪随机函数(PRF, Pseudo-Random Function),该函数通常基于哈希函数(如 SHA-256)和密钥派生函数(KDF)。
    • PRF 输入包括:预主密钥、客户端和服务器生成的随机数。
    • PRF 输出是多个会话密钥,包括对称加密密钥、消息认证码(MAC)密钥和初始化向量(IV)。

3. 会话密钥的验证

  • 验证握手消息: 客户端和服务器在握手的最后阶段通过 Finished 消息来验证会话密钥。Finished 消息的内容是对握手过程中所有消息的哈希值(使用会话密钥加密)。这样可以确保握手过程没有被篡改。
    • 客户端和服务器都会计算 Finished 消息,并进行比对。如果计算出的 Finished 消息一致,则表明握手过程没有被篡改,且会话密钥生成正确。

总结

对于开发者而言,虽然 SSL/TLS 握手过程的细节和密钥管理是透明的,但了解这些过程有助于理解 HTTPS 的安全性,帮助识别和解决可能的安全问题。在实际应用中,SSL/TLS 握手由库或框架处理,开发者通常只需要关注配置和调试,而无需直接操作握手过程的各个步骤。

 


http://www.ppmy.cn/news/1525717.html

相关文章

golang学习笔记22——golang微服务中数据竞争问题及解决方案

推荐学习文档 golang应用级os框架,欢迎star基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学…

Java学习Day41:骑龙救!(springMVC)

springMVC与sevlet都是对应表现层web的,但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标: 小案例: 1.导入依赖 spring-context: 提供 Spring 框架的核心功能,如依赖注入、事件发布和其他应用上…

Linux环境基础开发工具---vim

1.快速的介绍一下vim vim是一款多模式的编辑器,里面有很多子命令,来实现代码编写操作。 2.vim的模式 vim一共有三种模式:底行模式,命令模式,插入模式。 2.1vim模式之间的切换 2.2 谈论常见的模式---命令模式&#xf…

为什么H.266未能普及?EasyCVR视频编码技术如何填补市场空白

H.266,也被称为Versatile Video Coding(VVC),是近年来由MPEG(Moving Picture Experts Group)和ITU(International Telecommunication Union)联合开发并发布的新一代国际视频编码标准…

【云原生安全篇】一文掌握Harbor集成Trivy应用实践

【云原生安全篇】一文掌握Harbor集成Trivy应用实践 目录 1 概念 1.1 什么是 Harbor 和 Trivy? 1.1.1 Harbor 1.1.2 Trivy 1.2 Harbor 与 Trivy 的关系 Trivy 在 Harbor 中的作用: 1.3 镜像扫描工作流程 2 实战案例:在Harbor 配置 Trivy …

Android 签名、空包签名 、jarsigner、apksigner

jarsigner是JDK提供的针对jar包签名的通用工具, 位于JDK/bin/jarsigner.exe apksigner是Google官方提供的针对Android apk签名及验证的专用工具, 位于Android SDK/build-tools/SDK版本/apksigner.bat jarsigner: jarsigner签名空包执行的命令: jar…

【系统架构师】-论文-2024-2009年系统架构师历年论文题目

2024年5月 大数据Lambda架构的应用与分析 云原生云上DevOps运维应用与分析 模型驱动软件开发方法与应用 论单元测试在软件回归测试中的应用和分析 2023年 论面向对象设计的应用与实现 论多数据源集成的应用与实现 论软件可靠性模型的设计与实现 论边缘计算技术的设计与实现 …

openssh移植:精致的脚本版

前置文章: busybox移植:全能脚本版-CSDN博客 zlib交叉编译-CSDN博客 openssl移植:精致的脚本版-CSDN博客 源码下载 官网:http://www.openssh.com/ 下载了一个很新的版本 ftp://mirrors.sonic.net/pub/OpenBSD/OpenSSH/portable/openss…

android API、SDK与android版本

随着 Android 系统的不断更新,API Level 也会随之增加。每个新的 API Level 都引入了新的功能、改进旧的功能,或者弃用了旧的 API。开发者在开发应用时,需要指定目标 API Level,也就是应用最低支持的 Android 版本。 API Level 与…

C++速通LeetCode简单第9题-二叉树的最大深度

深度优先算法递归: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right…

Java面试题·解释题·单例模式、工厂模式、代理模式部分

系列文章目录 Java面试题解释题JavaSE部分 Java面试题解释题框架部分 Java面试题解释题单例模式、工厂模式、代理模式部分 文章目录 系列文章目录前言一、设计模式1. 单例模式1.1 单例模式的定义1.2 单例模式的实现方法 2. 工厂模式2.1 工厂模式的定义2.2 工厂模式的实现方法2…

JAVA毕业设计175—基于Java+Springboot+vue3的医院预约挂号管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的医院预约挂号管理系统(源代码数据库)175 一、系统介绍 本项目前后端分离(可以改为ssm版本),分为用户、医生、管理员三种角色 1、用户&#x…

使用Python自动抓取亚马逊网站商品信息

全量数据抓取不现实,但可以自动化、小批量采集亚马逊数据,现在可用的工具也非常多,包括Python以及一些专门的爬虫软件,我用过几个比较好入手的,像web scraper、八爪鱼、亮数据。 比如亮数据爬虫,它提供数据…

Qt C++ Udp相关知识学习(一)

文章目录 udp 单播消息,是什么意思特点:使用场景:例子:udp 广播消息,是什么意思特点:使用场景:示例:参考udp 单播消息,是什么意思 UDP 单播消息(UDP unicast)是指使用用户数据报协议(UDP)通过网络发送消息的过程,消息的接收者是单个特定的目标设备或IP地址。 特…

uniapp与webview进行数据通信

uniapp与webview进行数据通信&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width,initial-scale1,minimum-scale1,maximum-scale1,user-scalableno"…

Redis简介、常用命令及优化

文章目录 一、关系数据库​​与非关系型数据库概述1. 关系型数据库2. 非关系型数据库3.关系数据库与非关系型数据库区别 二、Redis简介1.Redis的单线程模式2.Redis 优点3.Redis 缺点 三、安装redis四、Redis 命令工具五、Redis 数据库常用命令六、Redis 多数据库常用命令七、Re…

【Linux取经之路】软件包管理器yum编辑器vim及其配置

目录 软件包管理器yum 1、什么是软件包 2、关于lrzsz 3、安装软件 4、查看软件 5、卸载软件 编辑器——vim 1、vim的基本概念 2、vim的基本操作 3、vim普通模式命令集 4、底行模式命令集 5、vim的配置 配置sodu权限 软件包管理器yum 1、什么是软件包 在Linux下…

大顶堆+动态规划+二分

前言&#xff1a;我们这一题需要分类讨论 对于我们左边和右边的我们需要预处理 有点类似反悔堆的做法&#xff0c;得出i之前取出 m 个元素代价最小&#xff0c;并且这个代价一定是递减的&#xff08;可以推导一下&#xff09; 题目地址 #include<bits/stdc.h> using name…

使用脚手架来创建 express 项目

使用脚手架&#xff08;scaffold&#xff09;可以快速搭建Express应用程序的基本结构。Express自身提供了一个官方脚手架工具叫做express-generator&#xff0c;它可以帮助你快速地生成一个包含基本文件结构的Express项目。 安装Express Generator 首先&#xff0c;你需要全局…

AI在医疗领域:MEDIC 全面评估大模型在医疗领域的应用

随着医疗领域中大型语言模型&#xff08;LLMs&#xff09;的迅猛发展&#xff0c;公众对于其评估的需求日益增长&#xff0c;要求超越传统的USMLE等基准测试&#xff0c;以更全面地反映模型在现实世界中的应用性能。尽管现实世界的评估对于衡量模型的实用性具有重要价值&#x…