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。

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

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

相关文章

Python学习笔记-类

1 定义类 类是函数的集合,class来定义类 pass并没有实际含义,只是为了代码能执行通过,不报错而已,相当于在代码种占一个位置,后续完善 类是对象的加工厂 2.创建对象 carCar()即是创建对象的过程 3、类的成员 3.1 实例…

福德植保无人机:绿色农业的新篇章

今天,我们荣幸地向您介绍福德植保无人机,一种改变传统农业种植方式,引领绿色农业的新科技产品。福德植保无人机以其高效、环保、安全的特点,正逐渐成为植保行业的新宠。福德植保无人机是一种搭载了高性能发动机和精确喷洒系统的飞…

代码随想录算法训练营第四十六天 _ 动态规划_背包问题总结。

学习目标: 动态规划五部曲: ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录! 本文大多数内容引用自代码随想录 60天训练营打卡计划! 学习内容: …

POJ - 2528 Mayor‘s posters

本题注意离散化的时候可能会出现区间串联情况&#xff0c;比如 [1,10] [5,10] [1,4] 和 [1,10] [6,10] [1,4] 直接离散化的话两者一样&#xff0c;但是实际上是不一样的 解决办法是你在相邻的差不是1的数对中再插一个数就好了 离线区间染色 查询根节点 #include<iostrea…

数组|73. 矩阵置零 48. 旋转图像

73. 矩阵置零 **题目:**给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 题目链接&#xff1a;矩阵置零 class Solution {public void setZeroes(int[][] matrix) {Stack<int[]> mapofzerone…

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

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

使用draw.io如何让矩形单个边框有颜色其余边框为空白?

方法步骤: 第一步&#xff1a;用户打开Draw.io软件&#xff0c;并来到流程图的编辑页面上&#xff1b; 第二步&#xff1a;接着在左侧的图形库中点击矩形选项&#xff0c;成功将其添加到流程图的绘制页面上&#xff1b; 第三步&#xff1a;这时用户点击矩形并在右侧窗口中点…

C++ //习题2.3 写出以下程序运行结果。请先阅读程序,分析应输出的结果,然后上机验证。

C程序设计 &#xff08;第三版&#xff09; 谭浩强 习题2.3 习题2.3 写出以下程序运行结果。请先阅读程序&#xff0c;分析应输出的结果&#xff0c;然后上机验证。 #include <iostream> using namespace std;int main(){char c1 a, c2 b, c3 c, c4 \101, c5 \116…

DL Homework 10

习题6-1P 推导RNN反向传播算法BPTT. 习题6-2 推导公式(6.40)和公式(6.41)中的梯度 习题6-3 当使用公式(6.50)作为循环神经网络的状态更新公式时&#xff0c; 分析其可能存在梯度爆炸的原因并给出解决方法&#xff0e; 当然&#xff0c;因为我数学比较菜&#xff0c;我看了好半…

Vue之数据绑定

在我们Vue当中有两种数据绑定的方法 1.单向绑定 2.双向绑定 让我为大家介绍一下吧&#xff01; 1、单向绑定(v-bind) 数据只能从data流向页面 举个例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…

BASH中export使用:命令行中传入变量

可以看到通过export address/project这句话 定义了一个变量address,数值为/project。

运维06:监控

监控生命周期 1.服务器上架到机柜2.基础设施监控 服务器温度&#xff0c;风扇转速 ipmitool命令&#xff0c;只能用在物理机上 存储的监控&#xff08;df, fdisk, iotop&#xff09; cpu&#xff08;lscpu, uptime, top, htop, glances&#xff09; 内存情况&#xff08;free&…

MVC Gantt Wrapper:RadiantQ jQuery

The RadiantQ jQuery Gantt Package includes fully functional native MVC Wrappers that let you declaratively and seamlessly configure the Gantt component within your aspx or cshtm pages just like any other MVC extensions. 如果您还没有准备好转向完全基于客户端…

(C++)只出现一次的数字I--异或

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

OpenAI承认ChatGPT变懒惰,正在修复该问题

OpenAI旗下的官方ChatGPT账号在社交平台表示&#xff0c;已经收到了大量用户关于GPT-4变懒惰的反馈。 这是因为自11月11日以来&#xff0c;OpenAI就没有更新过该模型。当然这不是故意的&#xff0c;大模型的行为是不可预测的&#xff0c;正在研究修复该问题。 外界猜测&#x…

企业欠税信息API:实现税务管理的智能化与高效化

前言 随着经济的发展和社会的进步&#xff0c;企业欠税问题逐渐凸显&#xff0c;成为制约经济发展的重要因素。为了解决这一问题&#xff0c;企业欠税信息API应运而生。它通过先进的技术手段&#xff0c;提供了一种全新的欠税信息查询方式&#xff0c;帮助企业实现税务管理的智…

nginx多ip部署

1.修改网卡信息自定义多个IP 进入/etc/sysconfig/network-scripts&#xff0c;编辑ifcfg-ens33网卡文件。将dhcp动态分配修改成static&#xff0c;同时添加ip地址子网掩码、网关和DNS。 修改完成后重启网卡&#xff0c;systemctl restart network 2.修改nginx配置文件 有几个…

Vue3无废话,快速上手

Vue3无废话&#xff0c;快速上手 认识Vue3 1. Vue2 选项式 API vs Vue3 组合式API <script> export default {data(){return {count:0}},methods:{addCount(){this.count}} } </script><script setup> import { ref } from vue const count ref(0) const…

【c++随笔16】reserve之后,使用std::copy会崩溃?

【c随笔16】reserve之后&#xff0c;使用std::copy会崩溃? 一、reserve之后&#xff0c;使用std::copy会崩溃?二、函数std::reserve、std::resize、std::copy1、std::resize&#xff1a;2、std::reserve&#xff1a;3、std::copy&#xff1a; 三、崩溃原因分析方案1、你可以使…

机器学习 | Python贝叶斯超参数优化模型答疑

机器学习 | Python贝叶斯超参数优化模型答疑 目录 机器学习 | Python贝叶斯超参数优化模型答疑问题汇总问题1答疑问题2答疑问题3答疑问题汇总 问题1:想问一下贝叶斯优化是什么? 问题2:为什么使用贝叶斯优化? 问题3:如何实现? 问题1答疑 超参数优化在大多数机器学习流水线…