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

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

首先快速说一下非对称加密和对称加密。非对称加密,就是有一个公钥和私钥(成对存在)。
公钥对一段文本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.mzph.cn/pingmian/72479.shtml

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

相关文章

ChatGPT、DeepSeek、Grok:AI 语言模型的差异与应用场景分析

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 人工智能&#xff08;AI&#xff09;语言模型正在快速发展&#xff0c;ChatGPT&#xff08;OpenAI&#xff09;、DeepSe…

正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-4 uboot目录分析

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

matlab 控制系统GUI设计-PID控制超前滞后控制

1、内容简介 matlab164-控制系统GUI设计-PID控制超前滞后控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

介绍HTTP协议基本结构与Linux中基本实现HTTPServer

介绍HTTP协议基本结构与基本实现HTTPServer HTTP协议 前面已经了解了协议的重要性并且已经定义了属于我们自己的协议&#xff0c;但是在网络中&#xff0c;已经有一些成熟的协议&#xff0c;最常用的就是HTTP协议 在互联网世界中&#xff0c;HTTP&#xff08;HyperText Tran…

Linux和RTOS简析

以下是针对 Linux驱动开发、RTOS&#xff08;实时操作系统&#xff09;任务状态&#xff08;就绪态&#xff09; 以及 互斥锁 的详细解释&#xff1a; 一、Linux设备驱动 1. 什么是设备驱动&#xff1f; 定义&#xff1a;设备驱动是操作系统内核的一部分&#xff0c;用于管理…

docker 常用命令大全(二),docker 镜像操作 ,持续更新

docker 相关的命令 在公共仓库中下载 docker pull bitnami/postgresql:12.8.0查看镜像 docker images |grep postgresql打tag推送到本地仓库 docker tag postgresql:12.8.0 docker.公司域名.com/library/postgresql:12.8.0推送到本地仓库 docker push docker.公司域名com…

Git使用和原理(3)

1.远程操作 1.1分布式版本控制系统 我们⽬前所说的所有内容&#xff08;⼯作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地&#xff01;也就是在你的笔记本或者 计算机上。⽽我们的 Git 其实是分布式版本控制系统&#xff01;什么意思呢&a…

[本周五题]Javascript面试常考题手撕场景UR缓存、new关键字、大数相加、最长递增子序列、高并发请求、大文件上传和WebWorks

LUR缓存实现 以下是 JavaScript 实现 LRU 缓存的详细解析&#xff0c;结合核心原理与代码实现&#xff0c;并标注来源&#xff1a; 一、LRU 缓存核心原理 LRU&#xff08;Least Recently Used&#xff09;缓存淘汰策略的核心思想是&#xff1a;当缓存容量满时&#xff0c;优先…

c语言zixue

该文主要是记录我学习中遇到的一些重点、易出问题的内容 教材p16.17 先从一个简单的例子开始吧 #include <stdio.h> //编译预处理命令 int main() //程序的主函数 {printf("To C"); //输出语句return 0; //返回语句 } #include <stdio.h>是编译预…

卷积神经网络(CNN)的主要架构

卷积神经网络&#xff08;CNN, Convolutional Neural Networks&#xff09;是深度学习中最重要的模型之一&#xff0c;广泛应用于计算机视觉、目标检测、语义分割等任务。自 LeNet 诞生以来&#xff0c;CNN 结构经历了多个重要发展阶段&#xff0c;出现了许多经典架构&#xff…

【开源代码解读】AI检索系统R1-Searcher通过强化学习RL激励大模型LLM的搜索能力

关于R1-Searcher的报告&#xff1a; 第一章&#xff1a;引言 - AI检索系统的技术演进与R1-Searcher的创新定位 1.1 信息检索技术的范式转移 在数字化时代爆发式增长的数据洪流中&#xff0c;信息检索系统正经历从传统关键词匹配到语义理解驱动的根本性变革。根据IDC的统计…

从0到1入门Docker

一、快速入门 Docker run命令中的常见参数 -d&#xff1a;让容器后台运行--name&#xff1a;给容器命名&#xff08;唯一&#xff09;-e&#xff1a;环境变量-p&#xff1a;宿主机端口映射到容器内端口镜像名称结构&#xff1a;Repository &#xff1a;TAG&#xff08;镜像名&…

接口自动化入门 —— Jmeter实现在接口工具中关联接口处理方案

1. JMeter 接口关联处理的核心概念 接口关联是指在多个接口请求之间共享数据&#xff0c;例如将一个接口的返回值作为另一个接口的输入参数。常见的场景包括&#xff1a; 使用登录接口返回的 Token 作为后续接口的认证信息。 将一个接口返回的 ID 作为另一个接口的请求参数。…

Flink-学习路线

最近想学习一下Flink&#xff0c;公司的实时需求还是不少的&#xff0c;因此结合ai整理了一份学习路线&#xff0c;记录一下。 当然&#xff0c;公司也有Scala版本Flink框架&#xff0c;也学习了一下。这里只说Java版本 1. Java基础 目标: 掌握Java编程语言的基础知识。 内容…

ranger集成starrock报错

org.apache.ranger.plugin.client.HadoopException: initConnection: Unable to connect to StarRocks instance, please provide valid value of field : {jdbc.driverClassName}.. com.mysql.cj.jdbc.Driver. 可能的原因 JDBC 驱动缺失&#xff1a;运行环境中没有安装 MySQL …

python Jsonpath表达式语法取值

python Jsonpath 语法规则&#xff1a; 演示数据&#xff1a;{"status":"0","msg":"成功","data": [ {"foo1": "bar1"},{"foo1": "bar2"}]} 根节点&#xff1a;$ $.status $.…

Blender-MCP服务源码2-依赖分析

Blender-MCP服务源码2-依赖分析 有个大佬做了一个Blender-MCP源码&#xff0c;第一次提交代码是【2025年3月7号】今天是【2025年月15日】也就是刚过去一周的时间&#xff0c;所以想从0开始学习这个代码&#xff0c;了解一下大佬们的开发思路 1-核心知识点 from mcp.server.fas…

反射(第三篇)、代理模式、静态代理和动态代理、InvocationHandler实际应用

DAY11.3 Java核心基础 反射&#xff08;第三篇&#xff09; 前两篇我们学习了反射的概念和基本操作 实际开发中&#xff0c;反射应用于那里&#xff1f; 动态代理 java中的动态代理就是一个重要的作用 代理模式 代理模式是java中常用的设计模式 指的是在处理一个业务逻辑…

Unity 封装一个依赖于MonoBehaviour的计时器(上) 基本功能

灵感来自下面这本书的协程部分,因此我就自己尝试写了一个 我的新书Unity3D游戏开发&#xff08;第3版&#xff09; | 雨松MOMO程序研究院 如果你不知道什么是协程:unity保姆级教程之协同程序_unity协同-CSDN博客 一句话概括:协程就是单线程的异步操作,其作用于Unity的主线程 1…

数学建模 第一节

目录​​​​​​ 前言 一 优化模型的类型 二 线性规划1 线性规划2 三 0-1规划 总结 前言 数学建模主要是将问题转化为模型&#xff0c;然后再以编程的形式输出出来 算法都知道&#xff0c;数学建模也需要用到算法&#xff0c;但是不是主要以编程形式展示&#xff0c;而是…