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