TLS、SSL、CA 证书、公钥、私钥

news2024/11/27 11:56:11

1. HTTP 的问题

HTTP 协议是超文本传输协议(Hyper Text Transfer Protocol)的缩写,它是从 WEB 服务器传输超文本标记语言 HTML 到本地浏览器的传送协议。HTTP 设计之初是为了提供一种发布和接收 HTML 页面的方法,时至今日,它的作用已经不仅仅于此了。

对于我们 Java 工程师而言,HTTP 应该算是再熟悉不过的东西了,目前 HTTP 有多个版本,使用较多的是 HTTP/1.1 版本。

然而 HTTP 协议有一个缺陷那就是它是通过明文传输数据的,用户通过 HTTP 协议传输的内容很容易被恶意拦截,并且黑客可以伪装成服务端,向用户传送错误的信息,并且能轻易获取用户的隐私信息,而这些操作用户是完全无感知的。

由于存在这样的安全隐患,现在小伙伴们见到的大部分网站都在逐步转为 HTTPS,HTTP 网站会越来越少了。

2. HTTPS

HTTPS(HyperText Transfer Protocol Secure)中文译作超文本传输安全协议,这是一种通过计算机网络进行安全通讯的传输协议。

HTTPS 本质上还是由 HTTP 进行通信,只是在 HTTP 协议和 TCP 层之间增加了一个 SSL 的安全传输协议。整个传输的加密过程都在新的安全层 SSL/TLS 中实现,而原来的 HTTP 层的传输流程保持不变,这样就很好地兼容了旧的 HTTP 协议,也沿袭了 TCP/IP 协议族的分层思想。

通过 HTTPS,客户端可以确认服务端的身份,保证数据在传输过程中不被篡改,当我们在自己的浏览器上与某一个网站建立 HTTPS 连接的时候,满足如下情况可以表示这个服务端可以被信任:

首先我们的操作系统中安装了正确且受信任的证书。我们在 cmd 命令行中执行 certmgr.msc 命令,可以查看操作系统已经安装的证书列表。

浏览器本身正确实现了 HTTPS。

被访问的网站提供了一个证书,这个证书是由一个操作系统所信任的证书颁发机构签发的,操作系统所信任的证书颁发机构一般都预装在操作系统中,通过第一步的方式可以查看。

被访问的网站所提供的证书被成功认证。

这里边涉及到一些证书和协议的概念,接下来松哥和大家把整个过程捋一捋。

3. TLS/SSL

前面我们提到,HTTPS 就是在 HTTP 的基础之上增加了 TLS/SSL,那么这两个东西该如何理解呢?

SSL/TLS 是一种密码通信方案,算是目前使用最广泛的密码通信方案了。SSL 全称是 Secure Socket Layer,中文译作安全套接层,是 1994 年由 Netscape 公司设计的一套协议,并与 1995 年发布了 3.0 版本;TLS 全称是 Transport Layer Security,中文译作传输层安全,则是 IETF 在 SSL3.0 基础上设计的协议,实际上相当于 SSL 的后续版本,目前 TLS 先后迭代了 TLS 1.0、TLS 1.1、TLS 1.2 和 TLS 1.3,目前被广泛使用的是 TLS 1.2 版本。

SSL/TLS 涉及到了密码学中的对称加密、非对称加密、数字签名等等,算是密码学领域里的集大成者了。

3.1 TLS

接下来我们就来看看 TLS 如何确保 HTTP 安全。

为了确保客户端和服务端之间的数据安全,我们很容易想到一种方案就是对传输的数据进行加密,没错,这是一个办法,事实上也是这么做的。

加密又分为两种:

对称加密

非对称加密

那么该使用哪一种呢?

对称加密,也就是加密密钥和解密密钥是同一个,当浏览器和服务端需要进行通信的时候,约定好一个密钥,然后使用这个密钥对发送的消息进行加密,对方收到消息之后再使用相同的密钥对消息进行解密。但是,在 B/S 架构的项目中,这种方案显然不合适,一个网站把自己的密钥告诉全世界所有的浏览器,那加密和不加密还有区别吗?

有小伙伴可能又想到了不对称加密,不对称加密倒是个办法,因为不对称加密是有一个密钥对公钥和私钥,公钥可以公布出来告诉所有人,私钥只有自己知道。通信的时候,客户端首先使用公钥对消息进行加密,服务端收到之后,再通过私钥对消息进行解密,这看起来似乎挺完美的。但是!!!非对称加密存在一个问题,就是非对称加密和解密相当耗时,通过这种方式处理加解密效率太低。

那怎么办?我们可以将两者结合起来。

具体来说,就是这样:首先服务端会生成一个非对称加密的密钥对,私钥自己保存,公钥发送给客户端,客户端拿到这个公钥之后,再生成一个对称加密的密钥,然后把对称加密的密钥通过公钥进行加密,加密之后发送给服务端,服务端通过私钥进行解密,这样客户端和服务端就可以通过对称加密进行通信了。

事实上,TLS 大致上的思路就是这样的。

不过上面这个方案还是有一个漏洞,那就是服务端要通过明文传输的方式把公钥发送给客户端,这个过程还是不安全的,可能被人恶意截胡,那么这个问题该如何解决呢?

这就涉及到另外一个概念叫做数字证书了。

3.2 CA

数字证书是一个包含了目标网站各种信息如网站域名、证书有效期、签发机构、用于生成对称密钥的公钥、上级证书签发的签名等的文件,通过数字证书我们可以确认一个用户或者服务站点的身份。

实际场景中的数字证书是一系列的,形成了一个信任链,信任链的最顶端是 CA。

CA 是 Certificate Authority 的简写,它是一个负责发放和管理数字的证书的第三方权威机构。CA 的工作流程是这样的:

CA 自己给自己颁发的用自己的私钥签名的证书称为根证书,根证书的私钥安全性至关重要,根证书的私钥都是被保存在离线计算机中,有严格的操作规章,每次需要使用时,会有专人将数据通过 USB 拷贝过去,操作完了以后,再将数据带出来(这个专指 CA 根证书的私钥)。

一个用户想要获取一个证书,首先自己得有一个密钥对,私钥自己留着,公钥以及其他信息发送给 CA,向 CA 提出申请,CA 判明用户的身份之后,会将这个公钥和用户的身份信息绑定,并且为绑定后的信息进行签名(签名是通过 CA 根证书的私钥进行的),最后将签名后的证书发给申请者。

一个用户想要鉴定一个证书的真伪,就通过 CA 的公钥对证书上的数字签名进行验证,验证通过,就认为这个这个证书是有效的。

上面这个流程中有一个重要前提,那就是 CA 受到大家所有人的信任。

然而在实际操作中,我们并不能直接去跟 CA 申请一个数字证书,因为全世界要认证的内容太多了,CA 搞不过来,而且频繁的找 CA 申请,还有可能导致私钥泄漏,这可就是一个大的灾难了。

那怎么办呢?实际操作中,我们可以基于 CA 来构建一个信任链。具体来说,步骤是这样:

首先我们的手机、笔记本等操作系统中都预装了 CA 颁发的根证书,他们是所有信任构建的基石,前面松哥已经截图给大家看了 Windows 中预装的根证书了。

假设 CA 签发了一个证书 A,在这个过程中 CA 称为 Issuer,A 称为 Subject,假设 A 是一个受信任的中间证书,已经预装在我们的操作系统中了。现在由 A 利用它自己的私钥给某一个网站签发了一个证书 B。

现在当我们的电脑需要访问该网站的时候,该网站就会给我们发来一个证书 B,由于我们的浏览器并不知道 B 证书是否合法,但是我们的电脑上已经预装了 A 证书,我们可以从 A 证书中提取出 A 的公钥,然后利用 A 的公钥对 B 证书的签名进行验证(因为 B 证书的签名是 A 的私钥签的),如果验证通过了,就说明 B 是合法的。

相同的道理,B 也可以继续签发 C 证书,C 继续签发 D 证书,这样就形成了一个信任链。

如果服务端的签名是 D 证书,那么一般来说,服务器返回给浏览器的就会包含 B、C、D 三个证书(因为 A 证书已经在我们的电脑上了),即使只返回 D 证书,浏览器也可以根据 D 书中的信息,自动下载到 B、C 两个证书然后进行验证。

松哥记得以前上大学的时候,在 12306 网站上买火车票,第一次访问的时候必须要自己先手动安装一个根证书到系统中,然后才能访问。这就是因为当时 12306 所使用的证书的签发机构不被浏览器认可,类似于上面的第 3 步,12306 给我发了一个数字证书 B 回来,但是浏览器上没有合适的公钥对这个 B 证书进行验证,当我往自己的系统上安装了 12306 给的证书之后,相当于我的电脑上有了一个证书 A,现在就可以对 B 证书进行验证了。

总结一下:

CA 是一个权威的机构,是一个发证机关,CA 发出来的证书可以证明一个人或者组织的身份。

任何人都可以得到 CA 的证书(含公钥),用以验证 CA 所签发的证书。

每一个数字证书都是由上级证书的私钥来签发的,处于最顶层的就是 CA 签发的根证书了,这个根证书没有上级证书了,所以这个根证书实际上是由 CA 自己的私钥来签发的,这也叫做自签名,即 Self-Signed。

当我们有了数字签名之后,就可以解决 3.1 小节最后提出的问题了。服务端将数字签名发给浏览器,浏览器利用系统已经内置的公钥验签,确认签名没问题,然后就提取出来数字签名中的公钥,开始协商对称加密的私钥了~

 

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

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

相关文章

计算机组成原理(期末或考研备考)- 主存储器,DRAM,SRAM,ROM

讲解视频 SRAM VS DRAM DRAM工作原理 DRAM采用栅极电容上的电荷存储信息,由于DRAM上的电容电荷一般只能维持1-2ms,即使电源不断电,信息也会自动消失。因此每隔一定时间必须刷新。 集中刷新,利用固定的时间对所有的行进行刷新&am…

程序员和网络安全的优劣势一览表

程序员的优点: 学的都是计算机基础和一些程序语言,入门比较简单,无论什么行业参加几个月的培训找到一份月薪5K的工作还是没有问题的,人才的需求量虽然没有之前多,但是对真正有技术的人才需求还是挺大的。 程序员的缺…

Python_魔法属性和方法

目录 魔法属性 __doc__ __moudle__ __class__ __name__ __dict__ 魔法方法 __new__() __init__ () __del__() __call__() __str__ () __getitem__(),__setitem__(),__delitem__() __setattr__()、__getattr__() __iter__() …

构建LLM应用你所要知道的事情;Midjourney可以生成图片外的场景

🦉 AI新闻 🚀 AI作画工具Midjourney推出新功能"Pan",可以生成图片外的场景 摘要:AI作画工具Midjourney最近推出了"pan"功能,用户可以通过控制输入框中的"上下左右"来平移图片以生成场…

【案例】VR全景图:效果+源码

狠人话不多说,直接放视频效果地址 一、效果 1.视频效果 视频效果地址:点击这里 2.图片效果 二、构思 该怎么实现?页面如何布局页面是否可随意控制显示1.功能 控制页面显示数量可放大控制全景图+自动播放左右按钮控制上一页或下一页(尾页:下一页按钮隐藏,首页:上一页按…

Spring Boot 中的熔断器:原理和使用

Spring Boot 中的熔断器:原理和使用 什么是熔断器? 熔断器是一种用于处理分布式系统中故障的设计模式。它可以防止出现故障的服务对整个系统造成连锁反应。熔断器通过监控故障服务的调用情况,当故障服务出现问题时,熔断器会迅速…

【vue】Vue3中使用函数调用组件内函数和创建组件【超详细】

uniappuview vue3typescript版本,使用函数方式调用和创建组件,并使用组件内的方法 项目场景 今天突然觉得在视图上应用组件,然后在script脚本里操作组件这方式特别的麻烦。因为每次使用组件时都要进行应用,不管你用不用你都要引…

TDengine“露面”中国油气田企业智慧油田技术交流大会,为时序数据处理带来全新思路

2023 年 7 月 4 日- 6 日,由中国石油和化学工业联合会主办,中国石油油气和新能源分公司、中国石化油田勘探开发事业部、中国海洋石油有限公司勘探开发部协办的“中国油气田企业智慧油田技术交流大会”在北京市召开。本次大会邀请了中国石油、中国石化、中…

Android Studio实现内容丰富的安卓房屋出租租赁平台

如需源码可以添加q-------3290510686,也有演示视频演示具体功能,源码不免费,尊重创作,尊重劳动。 项目编号063 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.查看租房列表…

SSMP整合案例(12) 在界面中实现删除操作

接下来我们来说删除 首先 我们要在表格上加上删除和修改两个操作按钮 我们先在App.vue页面部分编写 参考代码如下 <el-table-columnalign"right"label"操作" ><template slot-scope"scope"><el-buttonsize"mini"type…

王道考研数据结构——基本概念

06 算法的时间复杂度 线性的时间复杂度 O(n^3)O(n^2*logn) O(n^3) O(logN) 无法确定&#xff0c;和输入的数据量有关系&#xff0c;使用平均复杂度&#xff1a; 最坏/平均时间复杂度 07 算法的空间复杂度 S(n)n S(n)O(n^2) 刷题&#xff1a; O(n^3) 答案&#xff1a; B…

Maven 配置本地jar,通过下载第三方jar包,然后手动配置maven jar包依赖 例如:IKExpression

说明&#xff1a;有时候有一些jar包 maven中央仓库和阿里云仓库没有收录的jar包需要手动下载至本地进行手动添加maven依赖&#xff0c;就拿 IK表达式 IKExpression jar 包来说 第一步 下载IKExpression 包 没有这个包的同学可以点击下载阿里云盘分享 第二步 找到自己项目本地…

vue3+elementUiplus开发的项目如何修改公共标签的默认颜色

背景:使用elementUiplus开发路由菜单栏需要更改默认颜色 步骤: 查看用到的变量 如:var(–el-menu-bg-color); 修改: index.scss文件下进行style的修改 :root {--el-color-primary: #0cba80 !important; // 主题色--el-color-primary-dark-2: #0cba80 !important;--el-color-…

datagrip連接mysql數據連接不上

昨天使用datagrip進行數據庫的連接時發現遲遲連接不上&#xff0c;問了老大才發現問題是&#xff1a; 在host中是無需要加入jdbc:mysql://這些的&#xff0c;只需要將wiltechs-based…放入host中即可

3D点云实战案例

sd推荐免费3D场景建模工具&#xff1a;NSDT场景编辑器 CloudCompare是一个三维点云&#xff08;网格&#xff09;编辑和处理软件。最初&#xff0c;它被设计用来对稠密的三维点云进行直接比较。它依赖于一种特定的八叉树结构&#xff0c;在进行点云对比这类任务时具有出色的性…

vue前端权限控制设计

概述 vue前端和后端程序是分离开发的&#xff0c;既然是分离的&#xff0c;vue前端怎么进行用户权限控制呢&#xff1f;本文介绍vue前端权限控制的方法&#xff0c;包括后端接口访问权限、页面操作按钮的权限、菜单的查看权限和vue路由的访问权限。 后端接口的访问权限 后端…

【服务器必备】Docker:使用容器技术,轻松部署应用

1、介绍 1.1 docker是什么&#xff1f;&#xff08;来自于维基百科&#xff09; Docker是一种流行的容器化技术&#xff0c;它能够帮助开发人员和运维人员更快、更轻松地部署和管理应用程序。通过使用Docker&#xff0c;您可以将应用程序及其依赖项打包到一个轻量级、可移植的…

spring系列-Spring Boot从初识到实战

Spring Boot从初识到实战 一、Hello Spring Boot 1、Spring Boot 简介 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 2、微服务 微服务&#xff1a;架构风格&#xff08;服务微化&#xff09; 一…

问你个问题,项目进度怎样控制才有效?

早上好&#xff0c;我是老原。 有多少项目经理&#xff0c;每天都被项目进度搞得焦头烂额。 对于项目经理们来说&#xff0c;最可怕的事情莫过于项目虽然还在&#xff0c;但时间却没了…… 试问谁不想把项目和进度都牢牢握在手里&#xff0c;享受运筹帷幄的感觉&#xff0c;…

多领域应用落地,火山引擎ByteHouse加速云数仓升级

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近日&#xff0c;火山引擎数智平台VeDI直播活动「超话数据」在线举办&#xff0c;来自火山引擎的产品及解决方案专家分享了以ByteHouse为代表的云数仓产品在字节跳动…