证书关系到了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”颁发的。

TLS/SSL 协议详解(6) SSL 数字证书的一些细节1 证书验证相关推荐

  1. TLS/SSL 协议详解(6) SSL 数字证书的一些细节1

    证书关系到了SSL的众多安全性,比如身份认证,密钥交换.所以有必要单拉出一章来讲证书.本章完善一下前几节中的身份认证的一些缺点. 首先,通过前面讲解,我们知道,证书需要几个重要的字段.例如" ...

  2. TLS/SSL 协议详解 (30) SSL中的RSA、DHE、ECDHE、ECDH流程与区别

    我的TLS实现:https://github.com/mrpre/atls/ 大家可以参考,代码里面的逻辑较清晰. 我的SSL专栏见:https://blog.csdn.net/mrpre/artic ...

  3. HTTPS简介以及SSL协议详解

    HTTPS简介以及SSL协议详解 1.HTTPS简介 2.SSL协议介绍 2.1.SSL协议的功能 2.2.SSL协议在协议栈的位置 2.3.SSL协议组成 2.3.1.纪录协议的功能 2.3.2.S ...

  4. 【SSL协议】SSL协议详解

    背景介绍 最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. 在开始SSl介绍之前,先给大家介绍几个密码学的概念和相关的知识. 1.密码学的相关概念 ...

  5. 嵌入式 ssl协议详解

    背景介绍 最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. 在开始SSl介绍之前,先给大家介绍几个密码学的概念和相关的知识. 1.密码学的相关概念 ...

  6. https SSL协议详解

    最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. 在开始SSl介绍之前,先给大家介绍几个密码学的概念和相关的知识. 1.密码学的相关概念 密码学( ...

  7. python ssl模块详解_Python3 ssl模块不可用的问题

    编译安装完Python3之后,使用pip来安装python库,发现了如下报错: $ pip install numpy pip is configured with locations that re ...

  8. TLS握手协议详解下

    一 密码规格变更协议 TLS的密码规格变更协议是TLS握手协议的一部分,用于密码切换的同步. 那么为什么这个协议不叫密码规格开始协议,而是叫密码规格变更协议呢?这是因为即便在密码通信开始之后,客户端和 ...

  9. TLS/SSL 协议详解(17) Certificate verify

    发送这个类型的握手需要2个前提条件 (1):服务器端请求了客户端证书 (2):客户端发送了非0长的证书 此时,客户端想要证明自己拥有该证书,必然需要私钥签名一段数据发给服务器验证. 签名的数据是客户端 ...

最新文章

  1. PostGis基本操作-新建空间数据库与shp数据的导入
  2. 在MySQL 5.7下排查内存泄露和OOM问题全过程
  3. 【Linux】一步一步学Linux——dpkg-statoverride命令(277)
  4. alink的相關資料收集
  5. 轻松记账工程冲刺第二天
  6. 关于在新建的package中用SetContentView()函数时无法找到已创建的R.layout的布局文件的的问题的解决办法
  7. python apscheduler一次只有一个job_Python使用APScheduler实现定时任务过程解析
  8. FinTech领域的风险控制——风险篇
  9. L1-013. 计算阶乘和-PAT团体程序设计天梯赛GPLT
  10. UE4虚幻引擎更改项目缓存路径
  11. Rime中州韵导入QQ五笔词库
  12. javaWeb—9.Git
  13. 【allegro 17.4软件操作保姆级教程七】布线操作基础之二--铜皮操作
  14. AlphaGo灭了整个围棋界 下一步可能灭了散户跟交易员
  15. 京东到家埋点治理实践
  16. 地铁车辆主传动系统实时仿真测试平台ETest研究
  17. 20篇高质量程序人生文章分享,做开发不仅仅只有代码
  18. 1.删除链表的奇数节点 2.删除链表的偶数节点
  19. MFC 高速绘图坐标轴内添加纵向基准线的方法
  20. 西工大里的河南烩面的五一故事(数模、作业、课题组、考试)

热门文章

  1. Qt基于UDP的网络广播程序
  2. python2 python3 安装激活虚拟环境
  3. Lucene 5.2.1 + jcseg 1.9.6中文分词索引(Lucene 学习序列2)
  4. java signed_java什么是有符号、无符号
  5. IT项目团队管理及领导人素质随记
  6. mobiscroll 日期控件使用
  7. Scratch(十三):火柴人骑车
  8. 023 MySQL索引优化口诀-索引失效的常见情况
  9. Mysql数据库存储的原理
  10. 多臂高分子PEG试剂:4Arm PEG L-Lysine,四臂PEG L赖氨酸,4臂聚乙二醇衍生物