今天我们用问答的形式,来彻底弄明白HTTPS的过程
下面的问题都是 小明
和小丽
两个人通信为例
可以把小明
想象成服务端
,小丽
想象成客户端
答:数据安全传输用的。
答:把数据加密以后,再发送。
答:使用对称加密
方式
因为:
加密方式分3种:如下
- 单向加密 :对数据加密后,解密不了,主要用来验证数据完整性
- 非对称加密:使用密钥对,即公钥和私钥,公钥加密,私钥可解密,私钥加密,公钥也可解密,加密解密效率很低(公钥 - publicKey, 私钥 - privateKey)
- 对称加密:双方使用同样的一个密钥S进行加密解密。加密解密效率高
和第1个问题类似。现在的问题是:怎么把密钥S安全传输给对方
答:
注:我们用 publicKey, privateKey 分别代表 公钥和私钥
为什么:因为小丽用小明的publicKey加密,只有用小明的私钥才能解密
所以这个过程是安全的。
就算中间S1被别人截取了,因为没有小明的私钥,也解不开。所以是安全的。
因为私钥只有小明有,公钥是可以公开的,其它人有可能也会有。
上面的过程看似安全的,虽然黑客截取了数据,但是没有小明的私钥,是解不开的。
但是,如果小丽拿到的公钥不是小明的而是黑客的,会怎么样呢?
这就是中间人攻击了。下面分为小步骤讲解中间人攻击的过程
答:我们为了清晰描述这个过程,分几个步骤:
密钥S
进行加密,生成 密钥S1
密钥S1
发送小明,此时被黑客截取密钥S1
进行解密,得到密钥S
密钥S
了,并保存了一份副本密钥S
进行加密 ,得到 密钥S2
密钥S2
发送给小明密钥S2
,就用自己的privateKey,对密钥S2
解密,得到密钥S
密钥S2
的,因为密钥S2
是用的小明的公钥进行加密的。密钥S
后,接下来就用对称加密,用密钥S
对数据进行加密,发送给小丽密钥S
把数据解密,就可以看到内容了。密钥S
对数据进行加密后,发送给小丽所以,现在又产生了新的问题了了。可以用一张图来表示
小明和小花,以及老王,也就是本文中的
小明和小丽,以及黑客。这个图是以前做的,也懒得改了。能看懂就行。
就像升级打怪一样
第1怪:如何安全的传输数据?
答案:用加密
第2怪:用哪种加密?
答案:对称加密
第3怪:密钥S 如何安全传输给小丽?
答案:小丽用小明的公钥对密钥S加密,然后传给小明
经过第3怪后,又产生了新的问题:小明的公钥(publicKey
)如何安全的传输给小丽?
小明把公钥传输给小花的过程中,公钥被中间人掉包了,所以
如何把公钥安全的传输给小丽,又成了现在阶段让人头疼的问题。
那么小明如何安全的把自己的公钥,安全的传输给小丽呢?
答案:CA机构。现在我们知道了,小明直接把公钥传输给小丽,有被掉包的风险,进而造成中间人攻击
直接从小明那里获取已经不安全了,那么就去CA机构里面获取公钥
问题1:想象一下,生活中,我们有个矛盾,有个问题,我们最相信的是谁?
答案1:肯定是政府啊
所以,我们也搞一个机构,并起个名,叫CA,我们大家都相信这个机构,这是规定。
问题2:CA是干什么用的呢?
答案2:就是解决公钥传输的问题的
CA是如何解决公钥传输的呢?
问题3:CA是如何解决公钥传输的呢?
答案3:小明把公钥给CA,不但是小明,其它的小强,小华,小乐....,都会把自己的公钥放在CA那里。
反应到互联网上,就是网站把自己的公钥放到CA那里,比如www.helloworld.net
网站,就会把自己的公钥放在CA那里。其它人想用公钥进行通信的,就会去CA获取对方的公钥。
在这里就是小丽去CA那里获取小明的公钥
注:CA也是够倒霉的,把传输公钥这么容易出问题的事,交给我。
没办法,CA就得干这个活,没办法,谁让它是CA呢
答案:使用数字证书。
讨厌,又出来一个名词,数字证书。
大家千万不要晕哈。坚持看完。
CA机构用来解决公钥传输,具体就是用数字证书来传输公钥。
所以,先强调一下:数字证书就是解决公钥传输问题的
如何想了解数字证书,先解决下面几个问题。
答案:使用单向加密,比如md5算法。
具体过程如下
数据
进行加密,得到一个字符串,我们把这个字符串起个名字叫:摘要
数据
,对应的摘要
,都传给小丽数据
,摘要
后,用md5对数据
进行加密,得到摘要2
摘要
和摘要2
,如果相等,说明数据
是完整的,没有被改过。注:道高一尺,魔高一丈
在验证数据完整性的过程中,如果黑客又参与了呢?
数据
,摘要
发给小丽数据
和摘要
数据
为数据1
,然后用md5对数据1
加密,生成摘要1
数据1
,摘要1
发送给小丽数据1
,摘要1
后,用md5对数据1
进行加密,得到摘要2
摘要1
和摘要2
,如果相等,说明数据1
是完整的,没有被改过。上面这个过程,也可以用一张图来表示
依然是我之前写的文章中的配图,只不过名字不太一样,可以看懂即可。
答案:签名。
我们把几个名词放在一起,解释一下,容易说明白。
摘要:md5(或者其它单向加密算法),对数据进行加密出来的字符串,就叫做摘要
签名:小明用私钥对摘要进行加密,加密出来的字符串,就叫做签名
验签:小丽用小明的公钥,对签名进行解密操作,解密出来的摘要和原来的对比,就叫做验签
摘要
签名
没有被篡改过
被篡改过
此时,这个过程就是安全的了
比如,黑客又截取到了数据,摘要和md5算法
如果黑客再次截取了信件,黑客可以修改信件内容,再次用md5算出一个新的摘要出来
但是签名,黑客是修改不了的。因为签名是用的小明的私钥加密的,就算黑客能解密出来
黑客是没有办法生成新的签名的,因为小明的私钥只有小明自己有。
而且小丽收到信后,是用小明的公钥进行对签名解密的,黑客假如用自己的私钥对摘要进行加密生成新的签名
小花用小明的公钥是解密不了的。
答案:数字证书是由CA机构颁发的,比如小明想要一个数字证书,就需要向CA机构申请
将小明的公钥,颁发者,有效期,摘要算法 ,哈希算法写入证书
CA 根据证书中的指定的哈希算法
对证书整个内容(包含公钥,颁发者,有效期等)用哈希算法计算出整个证书的摘要,即 digest
也可以叫证书的指纹
CA根据签名算法以及上一步计算出来的摘要
**CA用自己的私钥对摘要进行加密,生成CA的签名,即 signature ** (记住这句话,后面有用)
最后把摘要,签名以及证书的基本信息,一起发布,就得到了小明的证书
从上面的描述我们知道,数据证书就是用来解决公钥传输问题的。
同时我也告诉你,证书其实就是一个文件 。
那么证书是如何解决传输问题的呢?
通过下面几个小问题,我们来一点点揭开证书的工作原理
答:多种方式,比如从网站上下载。
答:要验证证书是不是CA发的
解释:因为我们只相信CA是权威的,其它人发的我们认为是不安全的。所以要验证证书是否是CA发的。
答:验签
答:所谓 验签 : 就好比你对合同中的签名进行签证,到底是不是某个人的真实字迹
证书 - 签名,就类似 : 合同 - 签字
那么验签,就好验证一下,合同中的名字,是不是某个人的真实字迹,验证真的是这个人签的字。
在数字证书里面,验签:就是验证这个数字证书到底是不是CA颁发的。
上面说过:CA用自己的私钥对摘要进行加密,生成CA的签名,即 signature
所以,验签就需要CA的公钥。
答:验签的步骤:
d1
。d2
。答:操作系统自带的。
解释:
通过上面,我们知道,公钥在证书里面。
我们去哪里找CA的证书呢?
我们知道,需要证书,就去CA申请,CA会给我们颁发证书
那么CA机构也需要证书,从哪来呢?
其实也是CA颁发的,也就是CA自己给CA颁发证书。
当你安装操作系统的时候(不管是windows,linux,macos,android,ios等)
操作系统里面内置了大量的CA的证书。
所以我们无需关心CA的证书从哪里来。
答:步骤如下:
例如:小丽下载到了小明的证书。(相当于互联网里面,客户端从网站服务器那里下载了服务器的证书)
至此,我们完成了一件事:小丽安全的拿到了小明的公钥
我们先来看看,证书长什么样。在浏览器中打开 www.helloworld.net
我们看一下证书是什么样,如下图
在这里打一个小小的宣传一下我的副业,www.helloworld.net
是由码农兔哥在业余时间开发的一个技术社区
并获得了facebook公司的一个技术大牛的投资
希望大家多多喜欢支持。也可以加兔哥的微信,互相交流技术,吹牛,交朋友。vx: daitukeji
通过上面的讲解,我们现在把整个流程串一遍
从此小明和小丽就可以安全的进行通信了。
下面依然是以问答的方式,来总结所有的步骤。
如果你觉得本文对你有用,码字不容易,
请多支持一下,比如可以多转发,让更多的技术看到此文,多学点知识。
也可以访问一下
wwww.helloworld.net
, 注册个账号,如果你也喜欢写文章可以尝试在
www.helloworld.net
上面写一些文章或者加个微信交流一下技术也很欢迎,兔哥很谦虚,也很喜欢交朋友。
而且兔哥做过10多年研发,在实际工作中用过(不是写demo的那种)MFC,C/C++, Qt, bkwin, WTL,
duilib, ThinkPHP, vue2 , nuxt2 , ReactNative ,Android , Go 。 所以咱们能聊的应该很多。
vx: daitukeji
小丽和小明想安全的通信,怎么办?
对数据加密
用哪种加密方式
对称加密
密钥S如何安全的传输
小丽用小明的公钥对S进行加密,发给小明,小明用自己的私钥解密。
就这样,就传过来了。
小明的公钥如何安全的传输给小丽?
用数字证书
数字证书干什么用的?
用来安全传输公钥用的
CA颁发的。具体就是小明向CA申请。
用CA的公钥,对证书进行验签,通过说明是CA发的。
证书里面记录的有证书所有者
好了,码字真的好累,自己整理了一天
也是发现其它的文章HTTPS的原理讲的不是很明白。
自己下定决心也写一篇,其它在之前也写过一篇
但是那次写的,觉得还不通透,语言不够简练。
所以这篇文章希望能用更简练的语言,来把HTTPS的原理说明白。
如果你觉得文章对你有用,请点个赞或者转发一下吧,兔哥在此谢谢啦。