SSL/TLS 1.2过程:Client端如何验证服务端证书?

news2025/3/16 9:13:49

快速回顾非对称加密和对称加密

首先快速说一下非对称加密和对称加密。非对称加密,就是有一个公钥和私钥(成对存在)。
公钥对一段文本A加密得到文本B,只有对应的私钥能对B解密得到A。
私钥对一段文本C加密得到文本D,只有对应的公钥能对D解密得到C。
也就是一个密钥加密,只能用另一个密钥解密。不能用本身或者其他任何密钥解密。

对称加密则是另一种方式,一个密钥M对一段文本E加密得到文本F,只能由这个密钥M对文本F解密得到E。

快速回顾https

然后 https = http + SSL/TLS
SSL/TLS就是保证安全性,保证发送请求的时候不被第三方攻击。

前置知识

1、TLS主要是验证服务端是安全的
2、TLS证书安装在服务端,服务端有一对公钥和私钥
3、公钥全部人可见,私钥只有自己可见
4、除非双向认证,否则只有客户端验证服务端的身份

SSL/TLS 1.2过程

TLS/SSL过程:

1、客户端发送 ClientHello
2、服务端响应 ServerHello
3、服务端主动发送证书 (SSL证书,安装于服务端)
4、服务端发送ServerHelloDone
5、客户端验证服务端的SSL证书
(验证证书是重要的一步,后续会主要讲这个。主要目的就是为了验证服务端是经过CA机构认证的,并且正确拿到服务端的公钥)。
6、客户端生成一个密钥M,拿到服务端证书里带的服务端的公钥,加密M得到M1
7、客户端发送 ClientKeyExchange: 就是把M1发给服务端
8、服务端拿到M1,用服务端的私钥解密M1得到M:只有服务端能拿到这个M1
9、双方根据M生成主密钥S1和会话密钥S2:注意此时只有客户端和服务端知道S1和S2,其他人都不知道
10、客户端发送 ChangeCipherSpec 和 Finished
11、服务器响应 ChangeCipherSpec 和 Finished
12、确认完毕,后面都用S2对称加密文本。发的时候S2加密,解的时候S2解密。

这样为什么安全?

因为第5步,客户端正确拿到了服务端的公钥;公钥就是明文的,所有人都能拿到。
服务端的公钥加密的文本只能被服务端解密(只有服务端有对应私钥),所以可以发送一些信息给服务端。比如第8步的M1。

证书长啥样?

服务端证书:

-----BEGIN CERTIFICATE-----
*PS:以下信息都会被base64编码*
**服务端公钥**:C11
**数字签名**:xxx
**其他信息**:这里可以一笔带过,比如服务端名称,域名,颁发机构等
-----END CERTIFICATE-----

公钥:重要,一定要正确。
数字签名:重要,这个数字签名能保证这个证书是被CA机构认证过的,公钥是真的。
不然不法分子伪造一个证书,然后你拿到一个假的公钥,那么后续的发送消息都要被不法分子盗了。

CA机构

简单理解就是一些很权威的机构,能够给别人的证书加上数字签名。证书有了这个数字签名,这个证书就是被认证的证书,那么服务端就是被信任的。

CA机构怎么给别人的证书加上数字签名

CA机构也有证书。其中有一个是根证书,是被信任的证书,它被安装在操作系统中。大概操作系统开发者实地走访找到CA机构,并且拿到了根证书。

如上所述,根证书上有CA的C1,和它的数字签名。
根证书这个数字签名是它自己给自己签名的,叫做自签名证书。

CA机构有一个私钥C0,只有CA机构自己知道。
给某个证书签名步骤:
1、拿到这个证书的公钥C11和其他信息
2、计算 Hash (公钥C11 + 其他信息) = 一串hash后的结果A
3、用C0给A加密,得到A1。A1就是这个数字签名

为啥说有了签名就能验证服务端的确是被真正的CA机构认证过的呢?
看下一个

客户端如何验证服务端的SSL证书

上面说到,A1就是数字签名。客户端也安装了CA机构的证书,根证书,所以也有CA机构的公钥C0。
客户端验证服务端证书步骤:
1、客户端拿到证书,并且拿到里面的服务端公钥C11和数字签名A1,以及其他信息
2、客户端用C1给A1解密,会得到A
3、客户端计算 Hash (公钥C11 + 其他信息) = 一串hash后的结果B
4、验证A == B,一旦A和B相等,说明了 服务端公钥C11 + 其他信息 都是正确的
验证没问题后,说明C11正确。这也是TLS认证的第5步,主要目的是拿到正确的服务端公钥。拿到后就能开始按照上面第6步以后通信了。

什么是中间CA

CA机构有一个权威的根证书。用这个根证书给某个CA1证书签名。那么这个CA1证书也是可信赖的了。然后CA1也可以用上面的方法给服务端签名,当然也可以给CA2签名。
CA1,CA2都是中间CA。根CA给CA1签名,CA1给CA2签名,CA2给CA3签名,等等。最后一个CAn给服务端签名。CA1,CA2… CAn都是中间证书。
验证步骤就变成了,先用CAn验证服务端有没有问题,再用CA(N-1)验证CAn对不对,最后用根CA验证CA1是不是对的。一步步往上回溯。
最顶层的就是之前说的根证书。中间的都是中间CA证书。最底层的是服务端证书,也就是叶证书。
只要能回溯到根证书,那么这个验证就是通过的。
有了中间CA,一般的证书长这样:

-----BEGIN CERTIFICATE-----
<base64加密后的叶证书内容>
叶证书公钥:xx
叶证书数字签名:xxxx
其他信息:xxxxx
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<中间证书内容>
-----END CERTIFICATE-----

可信任证书

上面说到根证书是被信任的。其实也可以把中间CA证书放入电脑的信任列表里。这样回溯到这个中间CA就可以了。也就是能根据叶证书,中间证书慢慢回溯到某一个被信任的证书就可以了。

所以,对于内部系统,其实可以自己给自己的服务端生成一个证书(主要就是公钥和私钥),然后把它放入信任列表里。或者自己生成一个CA证书,把它放入信任列表里。

因为根CA是自签名证书。所以可以自己内部也生成一个自签名证书,把它放入信任列表里,充当CA根证书,并且用这个CA根证书给自己内部的服务都加上签名,就不会有SSL问题。其实也是安全的,因为这个根证书是自己造的,那么公钥肯定是可信任的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python(学习一)

做网站有成熟的框架像FLASK、DJANGO、TORNADO&#xff0c;写爬虫有好用到哭的REQUESTS&#xff0c;还有强大到没盆友的SCRAPY 随着NUMPY、SCIPY、MATLOTLIB等众多第三方模块的开发和完善&#xff0c;不仅支持py支持各种数学运算&#xff0c;还可以绘制高质量的2D和3D图像&…

Java中类和对象

类和对象 面向对象的认识类的定义和使用1 类的定义2 类的创建3 类的实例化 构造方法1 构造方法的概念2 构造方法的注意事项 this关键字 面向对象的认识 前言 何为面向对象何为面向过程呢&#xff1f;&#xff0c;C语言是最经典的面向过程的语言,但是C语言虽然可以解决一定的问…

文本组件+Image组件+图集

Canvas部分知识补充 元素渲染顺序 以Hierarchy参考 下方物体在上方物体前显示 子物体在父物体前显示 下方物体永远在前显示&#xff0c;无论上方的层次结构 资源导入 绝对路径&#xff1a;C:\Windows\Fonts下的许多字体可以用做UIText的字体资源 图片导入&#xff1a; 1.图…

PyCharm 2019.1.3使用python3.9创建虚拟环境setuptools-40.8.0报错处理

目录 前置&#xff1a; 一劳永逸方法&#xff08;缺最后一步&#xff0c;没有成行&#xff09; step one: 下载高版本的pip、setuptools、virtualenv的tar.gz包 step two: 进入PyCharm安装目录的 helpers 目录下 step three: 下载并安装grep和sed命令&#xff0c;然后执行 …

服务器部署RocketMQ----Docker方式

拉取镜像并创建docker network 按照官方文档提供的方式拉取镜像&#xff1a;docker pull apache/rocketmq:4.9.6 创建一个docker网络&#xff1a;docker network create rocketmq 启动NameServer以及Broker 启动NameServer # 启动NameServer docker run -d --name rmqnames…

【推荐项目】052-用水监控管理系统

052-用水监控管理系统 介绍 用水监控管理系统 springboot java vuejs jdk1.8 当然&#xff0c;以下是一个简洁的用水监控管理系统的功能模块划分&#xff0c;基于Spring Boot&#xff08;JDK 1.8&#xff09;后端和Vue.js前端&#xff1a; 用水监控管理系统功能模块 后端&…

零基础上手Python数据分析 (2):Python核心语法快速入门

写在前面 场景:每周销售数据报表整理 任务描述: 你需要每周从多个Excel文件中汇总销售数据,计算各项指标(销售额、订单量、客单价等),并生成周报。Excel操作痛点: 文件太多,手动打开复制粘贴,效率低下,容易出错。 多个Excel文件,每个都要打开、筛选、复制数据,重复…

游戏引擎学习第160天

回顾和今天的计划 我们没有使用任何游戏引擎和库&#xff0c;完全靠我们自己&#xff0c;使用的是老式的编程方式。 我们已经构建了很多内容&#xff0c;游戏引擎开发也慢慢接近尾声。现在我们已经接近完成了所有为支持游戏开发所需要的工作&#xff0c;接下来将逐步过渡到游戏…

从零搭建微服务项目Pro(第2-2章——JSR303自定义文件校验+整合至微服务公共模块)

前言&#xff1a; JSR 303&#xff0c;即 Bean Validation&#xff0c;是 Java EE 6 中的一项子规范&#xff0c;旨在为 Java Bean 提供一种标准化的数据验证机制。它通过注解的方式&#xff0c;允许开发者在 Java 类的字段或方法上直接定义验证规则&#xff0c;从而将验证逻辑…

如何用URDF文件构建机械手模型并与MoveIt集成

机械手URDF文件的编写 我们用urdf文件来描述我们的机械手的外观以及物理性能。这里为了简便&#xff0c;就只用了基本的圆柱、立方体了。追求美观的朋友&#xff0c;还可以用dae文件来描述机械手的外形。 import re def remove_comments(text):pattern r<!--(.*?)-->…

【训练细节解读】文本智能混合分块(Mixtures of Text Chunking,MoC)引领RAG进入多粒度感知智能分块阶段

喜欢本文可以在主页订阅专栏哟 核心创新&#xff1a;双重评估指标与混合分块架构&#xff1a; 第一章&#xff1a;检索增强生成&#xff08;RAG&#xff09;技术演进与分块挑战 1.1 RAG架构的核心演变 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff09…

招聘信息|基于SprinBoot+vue的招聘信息管理系统(源码+数据库+文档)

招聘信息管理系统 目录 基于SprinBootvue的招聘信息管理系统 一、前言 二、系统设计 三、系统功能设计 5.1系统功能模块 5.2管理员功能模块 5.3企业后台管理模块 5.4用户后台管理模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

HCIA-AI人工智能笔记1:大模型技术演进与发展历程

一、大模型发展的技术演进图谱 timelinetitle 大模型发展关键里程碑1958 : 感知机模型诞生&#xff08;Frank Rosenblatt&#xff09;1986 : BP反向传播算法&#xff08;Rumelhart&#xff09;2012 : AlexNet开启深度学习时代2017 : Transformer架构提出&#xff08;《Attenti…

在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别

在微信小程序或前端开发中&#xff0c;picker 和 select 都是用户交互中用于选择的组件&#xff0c;但它们在功能、设计和使用场景上有一定的区别。 1. picker 的特点 描述&#xff1a; picker 是微信小程序中的原生组件&#xff0c;通常用于选择单项或多项值&#xff0c;如时…

向量数据库对比以及Chroma操作

一、向量数据库与传统类型数据库 向量数据库&#xff08;Vector Storage Engine&#xff09;与传统类型的数据库如关系型数据库&#xff08;MySQL&#xff09;、文档型数据库&#xff08;MongoDB&#xff09;、键值存储&#xff08;Redis&#xff09;、全文搜索引擎&#xff0…

Python Matplotlib面试题精选及参考答案

绘制函数 y2x5 在区间 [1,10] 的折线图&#xff0c;设置标题和坐标轴标签 要绘制函数 y 2x 5 在区间 [1, 10] 的折线图&#xff0c;并设置标题和坐标轴标签&#xff0c;可借助 Python 的 matplotlib 库来实现。以下是详细的实现步骤与代码示例。 首先&#xff0c;要导入 mat…

正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-5.1 uboot顶层Makefile分析-VSCode工程创建

前言&#xff1a; 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用&#xff1a; …

OTP单片机调试工具之—单线数据编码

OTP单片机调试工具在实现过程中离不开单线数据的传输&#xff0c;那么使用哪一种方式的数据编码会比较好呢&#xff1f; 我所了解的主要有以下三种&#xff1a; 1.UART&#xff08;串口&#xff09;&#xff0c;这种方式在单片机和pc之间进行传输都非常常见&#xff0c;效率比较…

Java 基础到进阶企业技巧(二)

在 Java 学习的旅程中&#xff0c;我们逐步探索了其丰富的知识体系&#xff0c;从基础的数据类型、字符串操作&#xff0c;到流程控制、运算符的运用&#xff0c;每一步都为我们构建强大的编程能力奠定基石。同时&#xff0c;了解这些知识在 Java 全栈开发中的应用场景&#xf…

Google最新生图模型Gemini-2.0-Flash-Exp免费用

Google发布新生图模型 Google释放出最新生图模型&#xff0c;在发布说明中提到&#xff1a; 2025年3月12日 在 Gemini-2.0-Flash-Exp 中发布原生图像输出功能 Gemini 2.0 Flash Experimental 模型发布&#xff0c;支持原生图像输出功能。开发者能够使用 Gemini 进行图像输出和…