TLS/SSL 协议详解(6) SSL 数字证书的一些细节1 证书验证
证书关系到了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 证书验证相关推荐
- TLS/SSL 协议详解(6) SSL 数字证书的一些细节1
证书关系到了SSL的众多安全性,比如身份认证,密钥交换.所以有必要单拉出一章来讲证书.本章完善一下前几节中的身份认证的一些缺点. 首先,通过前面讲解,我们知道,证书需要几个重要的字段.例如" ...
- TLS/SSL 协议详解 (30) SSL中的RSA、DHE、ECDHE、ECDH流程与区别
我的TLS实现:https://github.com/mrpre/atls/ 大家可以参考,代码里面的逻辑较清晰. 我的SSL专栏见:https://blog.csdn.net/mrpre/artic ...
- HTTPS简介以及SSL协议详解
HTTPS简介以及SSL协议详解 1.HTTPS简介 2.SSL协议介绍 2.1.SSL协议的功能 2.2.SSL协议在协议栈的位置 2.3.SSL协议组成 2.3.1.纪录协议的功能 2.3.2.S ...
- 【SSL协议】SSL协议详解
背景介绍 最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. 在开始SSl介绍之前,先给大家介绍几个密码学的概念和相关的知识. 1.密码学的相关概念 ...
- 嵌入式 ssl协议详解
背景介绍 最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. 在开始SSl介绍之前,先给大家介绍几个密码学的概念和相关的知识. 1.密码学的相关概念 ...
- https SSL协议详解
最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. 在开始SSl介绍之前,先给大家介绍几个密码学的概念和相关的知识. 1.密码学的相关概念 密码学( ...
- python ssl模块详解_Python3 ssl模块不可用的问题
编译安装完Python3之后,使用pip来安装python库,发现了如下报错: $ pip install numpy pip is configured with locations that re ...
- TLS握手协议详解下
一 密码规格变更协议 TLS的密码规格变更协议是TLS握手协议的一部分,用于密码切换的同步. 那么为什么这个协议不叫密码规格开始协议,而是叫密码规格变更协议呢?这是因为即便在密码通信开始之后,客户端和 ...
- TLS/SSL 协议详解(17) Certificate verify
发送这个类型的握手需要2个前提条件 (1):服务器端请求了客户端证书 (2):客户端发送了非0长的证书 此时,客户端想要证明自己拥有该证书,必然需要私钥签名一段数据发给服务器验证. 签名的数据是客户端 ...
最新文章
- PostGis基本操作-新建空间数据库与shp数据的导入
- 在MySQL 5.7下排查内存泄露和OOM问题全过程
- 【Linux】一步一步学Linux——dpkg-statoverride命令(277)
- alink的相關資料收集
- 轻松记账工程冲刺第二天
- 关于在新建的package中用SetContentView()函数时无法找到已创建的R.layout的布局文件的的问题的解决办法
- python apscheduler一次只有一个job_Python使用APScheduler实现定时任务过程解析
- FinTech领域的风险控制——风险篇
- L1-013. 计算阶乘和-PAT团体程序设计天梯赛GPLT
- UE4虚幻引擎更改项目缓存路径
- Rime中州韵导入QQ五笔词库
- javaWeb—9.Git
- 【allegro 17.4软件操作保姆级教程七】布线操作基础之二--铜皮操作
- AlphaGo灭了整个围棋界 下一步可能灭了散户跟交易员
- 京东到家埋点治理实践
- 地铁车辆主传动系统实时仿真测试平台ETest研究
- 20篇高质量程序人生文章分享,做开发不仅仅只有代码
- 1.删除链表的奇数节点 2.删除链表的偶数节点
- MFC 高速绘图坐标轴内添加纵向基准线的方法
- 西工大里的河南烩面的五一故事(数模、作业、课题组、考试)
热门文章
- Qt基于UDP的网络广播程序
- python2 python3 安装激活虚拟环境
- Lucene 5.2.1 + jcseg 1.9.6中文分词索引(Lucene 学习序列2)
- java signed_java什么是有符号、无符号
- IT项目团队管理及领导人素质随记
- mobiscroll 日期控件使用
- Scratch(十三):火柴人骑车
- 023 MySQL索引优化口诀-索引失效的常见情况
- Mysql数据库存储的原理
- 多臂高分子PEG试剂:4Arm PEG L-Lysine,四臂PEG L赖氨酸,4臂聚乙二醇衍生物