SSL 数字证书的一些细节

news2025/1/31 15:46:56

参考:TLS/SSL 协议详解(6) SSL 数字证书的一些细节1 证书验证
地址:https://wonderful.blog.csdn.net/article/details/77867063
参考:TLS/SSL协议详解 (7) SSL 数字证书的一些细节2
地址:https://wonderful.blog.csdn.net/article/details/77867210

目录

  • 证书生成
  • 证书验证(如何保证你是证书的拥有者)
  • 证书是否能被伪造或盗用
  • 证书链
  • 证书格式
  • 私钥格式
  • 证书类型
  • 证书拓展

证书关系到了SSL的众多安全性,比如身份认证,密钥交换。所以有必要单拉出一章来讲证书。本章完善一下前几节中的身份认证的一些缺点。

首先,通过前面讲解,我们知道,证书需要几个重要的字段。例如“拥有者”、“颁发者”、“截止日期”。另外,生成证书的时候会自动生成一份“公钥”以及对应的“私钥”。现在假设我开了一个网站,准备用SSL加密的,需要让全世界信任我这个网站,那么我就需要一个证书,这时候我该怎么做?

证书生成

假设目前全世界就Google有那么一个root证书(根证书),名字叫做“Google”,显然,它的“颁发者”也是“Google”,因为根证书都是用工具生成的,并且根据第四章的知识,你应该知道,根证书没有颁发者,所以理所当然的,颁发者也是它自己。现在,全世界都信任这个证书,换句话说,浏览器里面都信任这个证书(约定俗成的)。我们也想和谷歌一样,有一个全世界都信任的证书,怎么做?

  • 第一步:给Google钱。

  • 第二步:告诉谷歌,我想要的证书名字叫做“www.dp.com”或者其他的你网站的域名。

  • 第三步:等着谷歌返回给你:证书、公钥、私钥。

谷歌收到钱后是怎么做的呢?首先肯定对你的网站、公司进行调查,确保你不是坏人,以免全世界都信任你了你却干坏事,这会让谷歌丢脸。

  • 第一步:用工具生成一对公钥和私钥。

  • 第二步:构造证书,把公钥嵌入到证书里面(即证书里面其实有一个字段是公钥,明文的)

  • 第三步:最重要的一步,谷歌拿自己的根证书签名一个第二步构造好的证书。

所谓签名:就是对第二步的证书做摘要,MD5或者SHA1,或者MD5+SHA1,得到结果,然后拿自己根证书的私钥加密这个结果,然后添加到证书最后面。

  • 第四步:把证书和私钥交给你。

在这里插入图片描述

这就是一个证书的生成过程。后续将讲解为什么这么生成证书。

证书验证(如何保证你是证书的拥有者)

上一节我们花很多钱,让谷歌生用自己的证书为我们签名了一个证书。现在我们可以把谷歌给我们的证书,安装到我们的网站中了。如果有一个客户端,访问我们的网站,我们发送我们的证书给客户端,客户端如何验证呢?(注意,第四章的验证比较简单,这里才是真正的验证)

之前说过,客户端信任了许多根证书,比如客户端信任一个叫做“Google”的证书。首先浏览器收到我们的证书之后,查看它的颁发者,哦,是“Google”,于是到信任的根证书里面找一个名字叫做“Google”的证书,通过字符串比较,我们很容易找到“Google”这个证书。然后进行验证:

  • 第一步:对我们的证书(除了“签名值”)全部内容进行MD5/SHA1,得到结果1。

  • 第二步:用“Google”证书中的公钥,对我们证书中的“签名值”进行解密,得到结果2。

  • 第三步:比较 结果1和结果2 ,发现一样,那么认证通过。理论上,如果中间没人改动我们的证书,那么,结果1和结果2 都是“asdfghjklqwertyu”。

证书是否能被伪造或盗用

那么上面的操作,如何保证了服务器身份能够被客户端认证呢?我们换个角度来思考,假设我是坏人,有一个网站叫做"www.dp.com",它的证书是Google签发的,我想欺骗客户端说自己是“www.dp.com”,怎么办?

第一种方法:

我们想到,既然浏览器信任一个叫做“Google”的证书以及“www.dp.com”,那我就在我的网站导入“www.dp.com”它不就行了吗,因为证书都是公开的,我随时随地能获得“www.dp.com”的证书?

但是根据第四章中“密钥的协商、交换”一节中提到的那样,公钥和私钥是一对的,我虽然得到了“www.dp.com”证书,证书中也有“www.dp.com”的公钥,但是我没有它对应私钥,而SSL的RSA算法握手时需要私钥操作。

比如,我虽然把“www.dp.com”证书发给客户端,客户端的确认证了,然后客户端用“www.dp.com”证书中的公钥加密一个密钥,按握手要求,服务器需要用私钥来解密,可是我没有对应私钥,以没办法解密!后面的会话都解密不了,即SSL握手完成不了。

对于ECDHE算法来说和RSA有点区别,由于私钥不参与秘钥协商(前向安全算法都不需要私钥进行秘钥协商),所以为了保证服务器是证书的拥有者(即拥有私钥),SSL协议规定,服务器在握手时,需要用私钥签名握手数据(server key exchange),客户端需要用公钥验证这个签名的握手数据。可见,如果服务器没有私钥,那么也就不能完成签名这步,或者签名的值客户端无法验证,握手无法继续。

第二种方法:

那我就也用工具,随便生成一个根证书,名字叫做“Google”,对应该证书,也会随机生成一个公钥和私钥,然后模仿谷歌的,拿这个根证书的私钥签名一个证书:颁发者填写“Google”,拥有者填写“www.dp.com” ,然后做MD5/SHA1,得到结果“asdfghjklqwertyu”,拿刚才自己生成的“Google”证书的私钥,对这个结果加密,得到“lkjhgfd”:

在这里插入图片描述

我把这个证书发给客户端,客户端找到叫做“Google”的证书,拿它的公钥解密这个签名值,问题来了,这个由于这个签名值是由我刚才假冒的“Google”证书的私钥签名的,所以,正宗的“Google”正宗的公钥解密得到的结果,压根不是“asdfghjklqwertyu”,当客户端对我们这个证书做摘要,结果是“asdfghjklqwertyu”,但是对签名解密的结果却是另外一个值,那么浏览器就不信任你了。

第三种方法:

看来生成证书的方法行不通,那只能随便找一个证书,修改里面的颁发者和拥有者。

在这里插入图片描述

但是问题又出现了,被修改证书的签名值没办法更改,因为签名值是拿其颁发者私钥进行加密的,我们没有颁发者Google的私钥。浏览器会对被篡改证书的签名用Google的公钥解密,然后对比浏览器自己对证书计算的摘要,不一样,浏览器就不认了,如果我们要改签名值,就需要颁发者即“Google”的私钥,不过这显然不可能。

上面伪造身份的结果的是失败的,其安全性都是基于那个“签名值”,签名值是用颁发者自己的私钥加密的,只要颁发者的私钥不泄密,那么不可能有人伪造证书。

证书链

之所以存在证书链这个东西,是因为验证证书的时候需要。

在这里插入图片描述

假设如上图所示,“Google”签名了一个“Android”,然后“Android”签名了一个“CyanogenMod”,我们浏览器只信任“Google”,如果服务器只发送一个叫做“CyanogenMod”,那么我们无法查找到叫做“Android”的根证书,无法验证服务器的身份。此时,作为服务器,我们可发送“Android”+“CyanogenMod”,这样,客户端会首先验证Android是否是CyanogenMod的颁发者(验证签名),如果是,那么在自己的根证书里面找“Android”的颁发者“Google”,然后验证“Android”是否是由“Google”颁发的。

证书格式

编码格式

证书编码格式多种,但是不要根据文件后缀名(der,cer)等区分证书格式。

总的来说,证书分为2种,一种是二进制的、一种是进行base64编码的证书。前者使用notepad或者任意文本编辑器打开,显示乱码,后者则显示正常的base64编码后的数据。下图为经过base64编码后的证书,由BEGAIN和END包括。(老司机可能就发现了,有点像长了一点的迅雷下载链接)

在这里插入图片描述

至于是否换行完全取决于base64的规范(详见wiki中关于base64 https://en.wikipedia.org/wiki/Base64)。

所谓二进制证书,也就是原始的asn1格式的证书,如果熟悉asn1编码方式,直接看2进制会看到明显的’30 82 …’等asn1的类型长度标识,这里不再赘述,但是二进制不适合网络传输,所以普遍采用base64将其编码。

其次还有一种格式叫pfx(PKCS12)格式的证书,与其说是证书,不如叫它证书+私钥的package比较合适,一个文件即包含证书(证书链),也包含私钥。pfx本身可被加密,所以可能需要输入密钥才能解析pfx。所以,解析pfx或者打开pfx时,可能需要用户输入2个密码,一个是pfx本身的密码,另一个是私钥的密码(私钥见下文)。

另一种证书格式称之为p7b,他是多个证书组织成的格式(一般是证书链)。在windows下可以由windows自带程序解析,我们可以提取出其中各个证书。

私钥格式

私钥格式也分为 二进制base64编码,不再赘述。

但是私钥本身可以被加密。

在这里插入图片描述

被加密的私钥格式如下:

在这里插入图片描述

当采用pfx格式证书时,由于pfx格式文件本身可能需要密钥来解密,而里面的私钥也可能需要密钥解密,所以解析程序往往可能让你输入2个密钥,这2个密钥是用来解密不同层级数据的,注意不要感到疑惑或者将两者混淆。

证书类型

签名算法一般采用RSA或者ECC。较老的有DH算法等,目前已不多见。

但是注意,被称为RSA证书并不是指证书是被RSA算法签名的,而是指证书本身的公钥、私钥是RSA。同理ECC证书指的是证书的公钥和私钥具有椭圆曲线属性。证书的签名值的类型并不影响证书的属性。

例如,上级证书A是ECC证书,即证书公钥私钥是ECC属性的,那么由它生产的证书B的签名必然采用ECC签名,但是B本身可以使用RSA公钥私钥或者ECC公钥私钥。

证书拓展

使用wireshark解析SSL证书,我们可以清晰的看到数字证书各个字段,这里我们关心证书中的extension:

在这里插入图片描述

1:keyusage/extkeyusage

用以描述证书的用法,改证书可以进行证书的签发?CRL的签发?客户端认证?服务器认证?一般严格的CA机构都谨慎设置这个字段,避免自己签发的证书被滥用。

2:subectkeyidentifier

自己公钥进行hash运算后的值,可以快速判断证书。

3:authoritykeyidentifier

上级证书的公钥进行hash运算后的值。一般来说,两个上下级关系的证书,下级证书的authoritykeyidentifier值就是上级证书的subectkeyidentifier值。

4:subjectAltname

证书的别名。例如一个网站有多个域名,例如www.baidu.com和www.hao123.com对应的都是一个服务器,common name只能写一个,为了不让浏览器告警,可以在subjectAltname拓展中添加这个网站的其他域名。浏览器收到这个证书,除了判断host和common name是否一致外,也会判断host和subjectAltname是否有一致项,有的话就成功。

5:basicConstraints

一般CA证书里面ca:Ture。

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

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

相关文章

Windows下nginx的启动,重启,关闭等功能bat脚本

echo off rem 提供Windows下nginx的启动,重启,关闭功能echo begincls ::ngxin 所在的盘符 set NGINX_PATHG:::nginx 所在目录 set NGINX_DIRG:\projects\nginx-1.24.0\ color 0a TITLE Nginx 管理程序增强版CLSecho. echo. ** Nginx 管理程序 *** echo.…

C语言动态内存经典笔试题分析

C语言动态内存经典笔试题分析 文章目录 C语言动态内存经典笔试题分析1. 题目一2. 题目二3. 题目三4. 题目四 1. 题目一 void GetMemory(char *p){p (char *)malloc(100);} void Test(void){char *str NULL;GetMemory(str);strcpy(str, "hello world");printf(str)…

lcx iptables rinetd 三个端口转发流量分析

lcx流量分析 环境搭建 本机 :192.168.0.52 win7 : 192.168.0.247 10.0.0.3 win10: 10.0.0.10 win7 Lcx.exe -listen 7777 4444win10 Lcx.exe -slave 10.0.0.3 7777 127.0.0.1 3389然后使用远程软件连接 连的是192.168.0.247的4444 端口 …

Mybatis与Spring结合深探——MapperFactoryBean的奥秘

文章目录 前言MapperFactoryBean的工作原理底层实现剖析MapperFactoryBean的checkDaoConfig()方法总结 MapperFactoryBean的getObject()方法 思考联想后续 系列相关相关文章究竟FactoryBean是什么?深入理解Spring的工厂神器超硬核解析Mybatis动态代理原理&#xff0…

idea 本身快捷键ctrl+d复制 无法像eclipse快捷键ctrl+alt+上下键,自动换行格式问题解决

问题 例如我使用ctrld 想复制如下内容 复制效果如下,没有自动换行,还需要自己在进行调整 解决 让如下快捷键第一个删除 修改成如下,将第二个添加ctrld 提示:对应想要修改的item,直接右键,remove是删…

【Kubernetes】持久化存储emptyDir/hostPath/nfs/PVC

k8s持久化存储 一、为什么做持久化存储?二、k8s持久化存储:emptyDir三、k8s持久化存储:hostPath四、k8s持久化存储:nfs4.1、搭建nfs服务4.2、挂载nfs共享目录 五、k8s持久化存储: PVC5.1、什么是PV5.2、什么是PVC5.3、…

[虚拟机]使用VM打开虚拟机电脑重启解决方案。

问题:打开虚拟机点击启动后,电脑会自动重启。(WINDOWS10 20版本) 解决步骤: 1、对Windows功能进行操作。 上图三个启用。 上图一个取消。 再次打开后,不报警,显示下图问题: 继续解…

VS Code使用教程

链接远程服务器 https://blog.csdn.net/zhaxun/article/details/120568402 免密登陆服务器 1生成客户机(个人PC)密令 ssh-keygen -t rsa生成的文件在主目录的.ssh文件当中。 查看密令并复制到linux系统当中 cat id_rsa.pub 2复制到服务器中 echo …

C++枚举类

枚举 C11有作用域枚举和无作用域枚举 无作用域枚举 特点 全局作用域:无作用域枚举的成员(枚举值)在包含它们的作用域内是直接可见的,不需要使用枚举类型名称作为前缀。 隐式类型转换:无作用域枚举的成员可以隐式地转换…

“新华三杯”第十届成都信息工程大学ACM程序设计竞赛(同步赛)L. 怎么走啊(最短路+二分 分段函数)

题目 登录—专业IT笔试面试备考平台_牛客网 思路来源 衡阳师范学院ac代码、pj学弟 题解 大致可以证明,在w从1e5减小到1的过程中, 之前某条反向边没有用到,现在需要用到反向边,也就是正向边用到的变少了 这样的变化有sqrt个&a…

【计算机网络基础1】网络层次划分和OSI七层网络模型

1、网络层次划分 为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了"开放系统互联参考模型",即著名的OSI/RM模型(Open Syste…

WPS宏批量修改图片尺寸

致谢 感谢网络各位大佬的分享,可以让我快速的学习这块内容。 JS宏代码

佳明(Garmin) fēnix 7X 增加小睡检测功能

文章目录 (一)零星小睡(二)小睡检测(三)吐槽佳明(3.1)心率检测(3.2)光线感应器(3.3)手表重量(3.4)手表续航 &a…

Nodejs后端+express框架

前言 基于vue3Node后台管理项目,补充nodejs和express相关知识。 文章目录 一,express 1.官网 Express - 基于 Node.js 平台的 web 应用开发框架 - Express中文文档 | Express中文网 2.安装 npm install express --save 二、MongoDB 特点 非关…

关于图像清晰度、通透度的描述

1、问题背景 在图像评测过程中,从主观上一般怎么去评判一副图像的优劣呢? 比较显而易见的就是图像的清晰度和通透度,他们决定了评判者对画质的第一印象。 那怎么去理解图像的清晰度和通透度呢?这是本文要描述的内容。 2、问题分…

reinforce 跑 CartPole-v1

gym版本是0.26.1 CartPole-v1的详细信息,点链接里看就行了。 修改了下动手深度强化学习对应的代码。 然后这里 J ( θ ) J(\theta) J(θ)梯度上升更新的公式是用的不严谨的,这个和王树森书里讲的严谨公式有点区别。 代码 import gym import torch from …

二十一章网络通信

计算机网络实现了堕胎计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据,编写网络应用程序前,首先必须明确网络协议…

用23种设计模式打造一个cocos creator的游戏框架----(八)适配器模式

1、模式标准 模式名称:适配器模式 模式分类:结构型 模式意图:适配器模式的意图是将一个类的接口转换成客户端期望的另一个接口。适配器模式使原本接口不兼容的类可以一起工作。 结构图: 适用于: 系统需要使用现有的…

力扣题:数字与字符串间转换-12.11

力扣题-12.11 [力扣刷题攻略] Re:从零开始的力扣刷题生活 力扣题1:506. 相对名次 解题思想:进行排序即可 class Solution(object):def findRelativeRanks(self, score):""":type score: List[int]:rtype: List[str]"&…

Java学习笔记——instanceof关键字

instanceof关键字: 作用:保证对象向下转型的安全性在对象向下转型前判断某一对象实例是否属于某个类 判断时,如果对象是null,则 instanceof 判断结果为 false