SSL 数字证书的一些细节

参考: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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

聚类算法的性能度量

聚类算法的性能度量 聚类算法就是根据数据中样本与样本之间的距离或相似度,将样本划分为若干组/类/簇,其划分的原则:簇内样本相似、簇间样本不相似,聚类的结果是产生一个簇的集合。 其划分方式主要分为两…

[GWCTF 2019]我有一个数据库1

提示 信息收集phpmyadmin的版本漏洞 这里看起来不像是加密应该是编码错误 这里访问robots.txt 直接把phpinfo.php放出来了 这里能看到它所有的信息 这里并没有能找到可控点 用dirsearch扫了一遍 ####注意扫描buuctf的题需要控制扫描速度,每一秒只能扫10个多一个都…

基于深度学习的超分辨率图像技术一览

超分辨率(Super-Resolution)即通过硬件或软件的方法提高原有图像的分辨率,图像超分辨率是计算机视觉和图像处理领域一个非常重要的研究问题,在医疗图像分析、生物特征识别、视频监控与安全等实际场景中有着广泛的应用。 SR取得了显著进步。一般可以将现有…

网络设备的健康检查方式

网络设备的健康检查方式 L3检查 通过ICMP来检查IP地址是否正常 L4检查 通过三次握手来检查端口号是否正常 L7检查 通过真实的应用通信来检查应用程序是否正常

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 CNN 部分

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 CNN 部分 概述CNN 简介数据预处理查看数据格式加载数据集 图像处理限定图像范围图像转换加载数据 CNN 模型Inception 网络ResNet 残差网络总结参数设置 训练 Train模型初始化数据加载训练超参数训练循环 验证…

实现Django Models的数据mock

目录 一、创建测试数据 二、使用随机数据 三、使用第三方库生成数据 四、编写测试用例 五、总结 在 Django 中,Model 是用于定义数据库表的结构的类。有时候,我们需要在测试或者开发过程中,模拟 Model 的数据,而不是直接从数…

springboot基础(80):redis geospatial的应用

文章目录 前言redis geospatial如何从地图上获取经纬度springboot 的相关方法调用准备redis服务器引用的依赖预设位置的keyGEOADD 添加位置GEORADIUS 获取指定经纬度附件的停车场(deprecated)GEORADIUS 获取指定成员附件的停车场(deprecated&…

SLMi8230BDCG-DG兼容Si8230BD-BS-IS 通过CQC认证隔离驱动方案探索

SLMi8230BDCG-DG 双通道1A 5.0kVRMS隔离栅极驱动器是一种具有不同配置的隔离双通道栅极驱动器。配置为高侧/低侧驱动器,峰值 电源 输出电流为1.0A,具有可编程死区(DT)功能。将DIS引脚拉高会同时关闭两个输出,并允许在D…

多合一iPhone 解锁工具:iMyFone LockWiper iOS

多合一iPhone 解锁工具 无需密码解锁 iPhone/iPad/iPod touch 上所有类型的屏幕锁定 在几分钟内解锁 iPhone Apple ID、Touch ID 和 Face ID 立即绕过 MDM 并删除 iPhone/iPad/iPod touch 上的 MDM 配置文件 支持所有 iOS 版本和设备,包括最新的 iOS 17 和 iPhone 1…

XML学习及应用

介绍XML语法及应用 1.XML基础知识1.1什么是XML语言1.2 XML 和 HTML 之间的差异1.3 XML 用途 2.XML语法2.1基础语法2.2XML元素2.3 XML属性2.4XML命名空间 3.XML验证3.1xml语法验证3.2自定义验证3.2.1 XML DTD3.2.2 XML Schema3.2.3PCDATA和CDATA区别3.2.4 参考 1.XML基础知识 1…

python:五种算法(DBO、WOA、GWO、PSO、GA)求解23个测试函数(python代码)

一、五种算法简介 1、蜣螂优化算法DBO 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、粒子群优化算法PSO 5、遗传算法GA 二、5种算法求解23个函数 (1)23个函数简介 参考文献: [1] Yao X, Liu Y, Lin G M. Evolutionary programming made…

[java学习日记]反射、动态代理

目录 一.反射的简单解释与获取字节码文件对象 二.获取构造方法对象Constructor 三.反射获取字节码文件中的成员变量Field 四.反射获取字节码文件中的成员方法:Method 五.反射练习:保存信息 六.反射练习:利用配置文件(存储类名…

学习通【劳动通论】2023章节练习题

社会主义核心价值观24个字是:富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善。 1、“富强、民主、文明、和谐”,是我国社会主义现代化国家的建设目标,也是从价值目标层面对社会主义核心价值观…

超级实用的防止商品超卖的 7 种实现方式,非常好用!

高并发场景在现场的日常工作中很常见,特别是在互联网公司中,这篇文章就来通过秒杀商品来模拟高并发的场景。 本文环境: SpringBoot 2.5.7 MySQL 8.0 X MybatisPlus Swagger2.9.2 模拟工具: Jmeter 模拟场景: 减库…

2000字总结—Redis常见命令

与其明天开始,不如现在行动! 文章目录 Redis常见命令通用命令String类型key的层级格式Hash类型List类型Set类型SortedSet类型 💎总结 Redis常见命令 通用命令 通过help[command]可以查看一个命令的具体用法 127.0.0.1:6379> help keysK…

鸿蒙应用开发ArkTS容器组件的使用

语雀知识库地址:语雀HarmonyOS知识库 飞书知识库地址:飞书HarmonyOS知识库 本文示例代码地址:Gitee 仓库地址 嗨,大家好,我是小白 上篇文章向大家介绍了 ArkTS 中我们经常使用到的几种基础组件,Text、Butt…

智能优化算法应用:基于教与学算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于教与学算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于教与学算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.教与学算法4.实验参数设定5.算法结果6.参考文…

【Python必做100题】之第三题(找出100以内的奇数并打印)

思路: 1、定义一个空列表来存储所有的奇数 2、判断是奇数就追加到列表的末尾 3、打印所有的奇数 代码如下: list [ ] #定义一个列表来存储所有的奇数 for i in range (1,100):if i % 2 ! 0: #判断是否为奇数list.append(i) #追加到列表的末尾 prin…

仿照MyBatis手写一个持久层框架学习

首先数据准备,创建MySQL数据库mybatis,创建表并插入数据。 DROP TABLE IF EXISTS user_t; CREATE TABLE user_t ( id INT PRIMARY KEY, username VARCHAR ( 128 ) ); INSERT INTO user_t VALUES(1,Tom); INSERT INTO user_t VALUES(2,Jerry);JDBC API允…