问题五:小明如何安全的把自己的公钥传输给小花
经过上面我们解决的问题可以知道
- 如何安全的把通信内容传输给对方?
解决方法:我们用对称加密的方式进行通信 - 如何安全的把
密钥S
安全的传输给对方 ?
解决方法:采用非对称加密方式,小明把自己的公钥给小花
小花用小明的公钥对密钥S
加密传给小明,小明用自己的私钥解密
这个过程只有小明能解密,所以是安全的
现在新的问题是:公钥如何安全传输给对方 ?
难道再用对称或者非对称加密?都不对。这样已经行不通了。
想象一下,生活中,我们有个矛盾,有个问题,我们最相信的是谁,肯定是政府啊
现在我从小明那下载公钥已经不靠谱了,已经不安全了
到底我应该相信谁呢?到底从谁那获取的公钥是小明真正的公钥呢?
所以,我们也搞一个机构,我们大家都相信这个机构,反正我就是无条件百分百相信这个机构,这是规定。
我们把这个机构起一个名字,叫做 CA
机构
好了,现在我们把问题抛给了 CA 机构,小花也好,小丽也好,小美也好,只要获取小明的公钥,都从 CA 那里获取
CA 机构哪来的小明的公钥呢?肯定是小明给的啊,对于小明来说,反正我已经把我的公钥给你 CA 了,你 CA 机构就得保证安全的传输给别人
这 CA 也是够倒霉的,你们搞不定的活,全抛给了我,又不是我和小花谈恋爱。。。
抱怨归抱怨,CA 是怎么解决的呢?
答案是 数字证书
, 怎么又出来一个名字,数字证书
是个什么鬼,是不是已经绕晕了,不要急,这个时候晕了,再回过过头再看看前面的写的
多看看几遍,别忘了,笔者也是看了 N 多遍,自己问自己问题,自己来尝试解决,才搞明白这个过程的。
先来说一个结论:数字证书就是解决公钥传输问题的
重要的事件重复三遍 :数字证书就是解决公钥传输问题的 ,数字证书就是解决公钥传输问题的 ,数字证书就是解决公钥传输问题的
在说数字证书之前,我们先解决这样一个问题
问题六:信件的传输过程中,如何保证内容不被篡改,即信息的完整性?
结合前面学到的加密知识,我们可以用单向加密算法,我们以 md5 加密算法举例
- 小明给小花写完信后,用 md5 对信件的内容作一次加密运算,得到一个唯一的字符串,我们把这个字符串起个名,叫做摘要
- 小明在信件的底部,写上单向加密算法 md5, 以及 md5 对信件内容运算出来的摘要,一块发给小花
- 小花收到信后,看到信件底部是 md5 算法,于是就用 md5 对信件内容进行加密算法,得到 新的摘要
- 小花将 新的摘要 和信件底部附加的 摘要 进行对比,如果相等,说明信件没有被人改过
- 如果不相等,说明信件内容被别人改过了。
如下图表示此过程。
但就是上面这个过程,也是有问题的,如果老王又出现了呢
- 首先老王拿到信了,把信给改了
- 老王用 md5 算法 ,重新把信件内容给 md5 一下,得到新的加密串
- 老五把新的加密串,放在信件底部,发给了小花
- 此时小花收到信后,是没办法判断出来,信件是不是被篡改过的。
如下图表示:
所以,单纯的使用单向加密算法 ,生成摘要,是不能保证内容的完整性的
那么如何才能保证信件的完整性,不被人篡改呢?
答案是,签名
又出来一个名词,签名,本文的名词太多了。
通过前面学习,我们知道,非对称加密,有 2 个作用,其中一个就是身份认证
还是上面的例子我, 我们改一下:
- 小明用 md5 对信件内容进行运算,得到一个字符串,我们起名叫摘要
- 小明用自己的私钥对摘要进行加密运算,得到另一个字符串,我们起名叫签名
- 将 md5, 摘要, 签名一块发给小花
- 小花用小明的公钥对签名进行解密,到得信件摘要,假如为 d1
- 小花用 md5 对信件内容进行运算,得到信件摘要,假如为 d2
- 对比 d1 和 d2 是否相等,相等说明信件内容没有被篡改过
- d1 和 d2 不相等,说明信件内容被篡改过。
此时,这个过程就是安全的了
如果老王再次截取了信件,老王可以修改信件内容,再次用 md5 算出一个新的摘要出来
但是签名,老王是修改不了的。因为签名是用的小明的私钥加密的,就算老王能解密出来
老王是没有办法生成新的签名的,因为小明的私钥只有小明自己有。
而且小花收到信后,是用小明的公钥进行对签名解密的,老王假如用自己的私钥对摘要进行加密生成新的签名
小花用小明的公钥是解密不了的。
此时再来进行一时概念的定义
摘要 :md5(或者其它单向加密算法),对内容进行加密出来的字符串,就叫做摘要
签名 :小明用私钥对摘要进行加密,加密出来签字串,就叫做签名
验签 :小花用小明的公钥,对签名进行解密操作,解密出来的摘要和原来的对比,就叫做验签
问题七:数字证书是怎么由来的?
数字证书是由 CA 机构颁发的,首先小明如果想要有一个数字证书,就需要向 CA 机构申请
CA 机构就会给小明颁发一张数字证书,里面包含了
- 公钥:小明的公钥
- 颁发者:CA(证书认证机构)
- 有效期:证书的使用期限
- 摘要算法:指定的摘要算法,用来计算证书的摘要
- 指纹:也就是证书的摘要,保证证书的完整性
- 签名算法:用于生成签名,确保证书是由 CA 签发
- 序列号:证书的唯一标识
知道了证书里面包含的内容,我们了解一下证书是如何产生的?
- 将小明的公钥,颁发者,有效期,摘要算法 ,哈希算法写入证书
- CA 根据证书中的指定的哈希算法,计算出整个证书的摘要,即 digest
- CA 根据签名算法以及上一步计算出来的摘要,
CA用自己的私钥
对摘要进行加密,生成 CA 的签名,即 signature - 最后把摘要,签名以及证书的基本信息,一起发布,就得到了小明的证书
问题八:数字证书的作用
从上面我们知道,数字证书就是解决公钥传输问题的,同时我们也知道,数字证书就是一个文件
既然数字证书是用来解决公钥的安全传输的,那么到底如何解决传输问题的呢
现在小明有了自己的证书了,我们就不会公开传输公钥了,只需要传输证书就行了
那么,小明和小花现在需要安全的通信,那么流程是怎么样的呢?如下
- 小明把自己的数字证书发送给小花
- 担心证书被老王掉包,小花需要对证书进行验证,验证什么呢?
- 其实就是验证此数字到底是不是 CA 机构颁发的,不是 CA 机构颁发的证书,我们就认为传输是不安全的。
- 验证数字证书是不是 CA 颁发的,需要有
CA的公钥
。。。(为啥需要 CA 的公钥啊,因为证书上的签名,是 CA 的私钥加密的啊,只有 CA 的公钥才能解密啊)
啊啊啊,受不了啦,搞了半天怎么又需要公钥,我们讲了半天的数字证书,就是为了传输公钥的
所以,换成下面的描述会好点
验证数字证书是不是 CA 频发的,需要 CA 的数字证书(因为里面有 CA 的公钥) - 那我们去哪里找 CA 的数字证书呢?从上面的描述,我们知道了,需要一个数字证书,就向 CA 申请,CA 给我们颁发。
- 那么 CA 机构自己的数字证书哪来的呢?答案是也是自己给自己颁发的,那么我们从哪里获取呢?
- 如果从网上,或者从其它服务器下载,又有可能会被掉包,又不安全了。
- 这真的是个伤心的故事,但是今天兔哥非要把这个故事讲完。
- 从网上下载或者从其它服务器下载数字证书,都不安全的,那么怎么样才是安全的呢?
- 答案就是:你的电脑安装操作系统的时候,操作系统里面,就已经内置了非常多的 CA 机构的数字证书了
- 也就说,只要你安装了操作系统,不管是 windows, linux, 或者 mac , 或者你刚买的电脑,里面都已经有了 CA 机构的数字证书了
- 这个是可以相信的,是真的 CA 机构的数字证书,不会有假。(除非你安装的是盗版的操作系统,所以我们尽量用正版操作系统)
上面的过程真的是复杂啊,兔哥也是花了很久才搞明白的,知道这块面试会坑很多人,其实 https
过程不知道,也没啥关系
也不影响你写代码,但是那些面试官就死爱问这块,好像他们能搞懂这个过程很了不起似的,你问点设计模式它不香嘛。
不过话说回来,兔哥在写自己的 HelloWorld 技术社区 的时候,配置
https
,数字证书,不懂这些,还真的不好搞啊写文章不容易,尤其是写这篇文章,为了写的更容易懂点,花了不少精力,能看到这块的,帮忙给个关注吧
尤其是帮忙宣传一下兔哥的 HelloWorld 技术社区 , 同一个世界,同一行代码,我们的域名是:www.helloworld.net
- 我们的电脑,天生就有 CA 的数字证书,而且是真的。天生的。上天定的,上天最大
那么我们就可以对数字证书进行辨别真伪了。
问题九:对数字证书的验证
从上面可以知道:
小花收到了小明的数字证书,首先要对数字证书进行验证,就是验证此数字证书是不是 CA 颁发的
因为我们操作系统里面内置了所有 CA 机构的数字证书,所以,我们就可以对数字证书进行验证
在说流程之前,先来简单的复习一下前面的,摘要和签名怎么来的
摘要 = md5 (证书内容) :单向加密算法,比如 md5,对证书整个内容进行加密,得到摘要,也叫做证书的指纹
签名 = privateKey (摘要) : 私钥对上一步摘要加密,产生签名
数字证书的验证流程如下:
- 小花用内置的 CA 的数字证书,得到 CA 的公钥
- 小明发过来的数字证书,我们假如叫做 C , 小花用 CA 的公钥对 C 证书里面的签名进行解密,得到摘要 D
- 小花根据 C 证书里面的摘要算法,假如是 md5,小花用 md5 对证书整个内容进行计算,得到摘要 D1
- 小花对比摘要 D 和摘要 D1 是否相等
- 如果 D == D1 ,那么说明此证书就是 CA 颁发的
- 如果 D != D1 , 那么说明此证书不是 CA 颁发的,是有风险的,不安全的
假如证书验证通过,就说明此证书的确是 CA 颁发的,此时小花就可以从数字证书中拿到小明的公钥了
因为小明在申请数字证书时,数字证书中所有者是小明,CA 是会验证小明的身份的,所以数字证书中小明的公钥是真实的
由至此,我们总算完成了一件事:小明正确的把自己的公钥安全的传输给了小花
这件事的成立 ,接下来我们的工作就好做多了。接下来,我们看一下具体的传输过程
问题十 :完整的传输过程
下面我们看一下小明再次给小花通信,就和前面的不一样了,我们来看下:
- 小明把写完的信,在信的底部,附加上摘要算法,假如是 MD5, 以及通过 MD5 算出来的摘要
- 小明用自己的私钥,对上一步的摘要进行加密,得到签名
- 小明把摘要算法,摘要,签名都附加到信件底部以后,再把自己的数字证书,一起发送给小花
- 小花收到信后,首先用自己的 CA 数字证书,拿到 CA 公钥,再用 CA 公钥对数字证书进行验证(也就是上面我们讲的流程)
- 数字证书验证通过后,说明证书就是 CA 颁发的,没有被篡改
- 小花就从证书中拿到了小明的公钥
- 有了小明的公钥,接下来的过程,就是对信件内容进行验证了
对信件内容的验证流程如下(前面其实我们讲过)
- 小花用小明的公钥,对信件的签名进行解密,得到信件的摘要 D1
- 小花用摘要算法,对信件进行运算,得到信件的摘要 D2
- 小花对比 D1 是否等于 D2
- 如果不相等,说明信件被人篡改过,不安全
- 如果相等,说明,信件内容没有被篡改过
- 相等的情况,小花就拿到了信件的内容
总结:
以上所有的内容,是数字证书,加密解密,签名,验签的过程,还没有正式讲 https
的过程呢。
有了以上的知识,我们讲起来 https 就容易的多了。下面我们看一张图
我们以访问 www.helloworld.net
网站为例,讲解 https 的过程
此过程分为 3 个阶段,我们在下面描述此 3 个阶段
访问 www.helloworld.net
的过程 阶段如下
- 网站申请证书阶段
- 网站向 CA 机构申请数字证书(需要提交一些材料,比如域名)
- CA 向证书中写入摘要算法,域名,网站的公钥等重要信息
- CA 根据证书中写入的摘要算法,计算出证书的摘要
- CA 用自己的私钥对摘要进行加密,计算出签名
- CA 生成一张数字证书,颁发给了
www.helloworld.net
- 网站的管理员,把证书放在自己的服务器上
- 浏览器验证证书阶段
- 浏览器在地址栏中输入
https://www.helloworld.net
,并回车
- 服务器将数字证书发送给浏览器
- 浏览器用操作系统内置的 CA 的数字证书,拿到 CA 的公钥
- 浏览器用 CA 公钥对 www.helloworld.net 的数字证书进行验签
- 具体就是,浏览器用 CA 公钥,对 helloworld 的数字证书中的签名进行解密,得到摘要 D1
- 浏览器根据 helloworld 数字证书中的摘要算法,计算出证书的摘要 D2
- 对比 D1 和 D2 是否相等。
- 如果不相等,说明证书被掉包了
- 如果相等,说明证书验证通过了。
- 协商对称加密密钥阶段
- 浏览器验证数字证书通过以后
- 浏览器拿到数字证书中的公钥,也就是
www.helloworld.net
网站的公钥 - 浏览器有了网站的公钥后,就用公钥进行对
密钥S
进行加密,加密以后的密文发送给服务器 - 服务器收到密文后,用自己的私钥进行解密,得到
密钥S
- 此后浏览器,服务器双方就用
密钥S
进行对称加密的通信了。
终止所述,终于讲完了,花了整整一天的时间
过程那么多,其实抓住几个关键的问题是很简单的,本质上还是两个人,如何安全高效的进行通信
我们再次简单的总结一下,采用一问一答的方式,我觉得比较好
问题一:小明和小花安全的通信,怎么做?
答:通过加密
问题二:通过哪种加密方式通信,更高效?
答:对称加密
因为,单向加密,没办法解密,不行
非对称加密,太慢,也不行
只有对称加密,速度快
问题三:采用对称加密,密钥 S 怎么安全传输?
答:小花使用小明的公钥,对密钥S
进行加密,传给小明
小明用自己的私钥解密
问题四:小明如何安全的把自己的公钥传输给小花?
答:使用数字证书
具体就是 小明向 CA 申请一个自己的数字证书,把自己的公钥放在证书中
小明将数字证书发送给小花
问题五:小花如何验证数字证书的真实性?
答:小花用操作系统内置的 CA 的数字证书,拿到 CA 的公钥,用 CA 的公钥,对数字证书进行验签
验签通过,说明数字证书是真的。
以上几个问题,希望读者多问问自己,如果是自己,应该怎么解决这个问题。