HelloWorld开发者社区

www.helloworld.net - 开发者专属的技术社区

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

很多人讲不明白HTTPS,但是我能

今天我们用问答的形式,来彻底弄明白HTTPS的过程

下面的问题都是 小明小丽两个人通信为例
可以把小明想象成服务端小丽想象成客户端

1. https是做什么用的?

答:数据安全传输用的。

2. 数据如何安全的传输?

答:把数据加密以后,再发送。

3. 用哪种加密方式?

答:使用对称加密方式

因为:

  1. 单向加密:数据解密不了,不适合
  2. 非对称加密:加密解密效率低,不适合
  3. 对称加密:加密解密效率高,非常适合

加密方式分3种:如下

  1. 单向加密 :对数据加密后,解密不了,主要用来验证数据完整性
  2. 非对称加密:使用密钥对,即公钥和私钥,公钥加密,私钥可解密,私钥加密,公钥也可解密,加密解密效率很低(公钥 - publicKey, 私钥 - privateKey)
  3. 对称加密:双方使用同样的一个密钥S进行加密解密。加密解密效率高

4. 使用对称加密,会产生一个问题,密钥S容易被截取,那么密钥S又如何安全传输过去?

和第1个问题类似。现在的问题是:怎么把密钥S安全传输给对方

答:

  1. 小丽拿到小明的publicKey
  2. 小丽用publickey对密钥S进行加密,得到S1
  3. 小丽把S1发送给小明
  4. 小明用自己的privateKey对密钥S1进行解密,得到密钥S
  5. 此后小明和小花就用密钥S,对称加密算法进行通信了。

注:我们用 publicKey, privateKey 分别代表 公钥和私钥
为什么:因为小丽用小明的publicKey加密,只有用小明的私钥才能解密
所以这个过程是安全的。

就算中间S1被别人截取了,因为没有小明的私钥,也解不开。所以是安全的。
因为私钥只有小明有,公钥是可以公开的,其它人有可能也会有。

上面的过程看似安全的,虽然黑客截取了数据,但是没有小明的私钥,是解不开的。
但是,如果小丽拿到的公钥不是小明的而是黑客的,会怎么样呢?
这就是中间人攻击了。下面分为小步骤讲解中间人攻击的过程

5. 什么是中间人攻击

答:我们为了清晰描述这个过程,分几个步骤:

  1. 在小明和小丽中间,有个黑客。也就是 小明 -- 黑客 -- 小丽
  2. 小明把自己的publicKey传给小丽的时候,被掉包了(别管黑客怎么办到的)。怎么掉包的呢?继续往下看
  3. 小明把publicKey传给小丽,但是中间有个黑客
  4. 实际上黑客截取了小明的publicKey。
  5. 然后,黑把自己也有一套自己的公钥和私钥,假如叫做 publicKeyHK, privateKeyHk
  6. 黑客把自己的publicKeyHK发给了小丽
  7. 接下来开始通信了
  8. 小丽用publicKeyHK把 密钥S进行加密,生成 密钥S1
  9. 小丽把密钥S1发送小明,此时被黑客截取
  10. 黑客用自己的私钥privateKeyHK,对密钥S1进行解密,得到密钥S
  11. 此时黑客有了真正的密钥S了,并保存了一份副本
  12. 然后黑客用小明的publicKey,对 密钥S 进行加密 ,得到 密钥S2
  13. 黑客把密钥S2发送给小明
  14. 小明收到密钥S2,就用自己的privateKey,对密钥S2解密,得到密钥S
  15. 上面小明是可以用自己的私钥解开密钥S2的,因为密钥S2是用的小明的公钥进行加密的。
  16. 小明拿到了密钥S后,接下来就用对称加密,用密钥S对数据进行加密,发送给小丽
  17. 因为中间有黑客,所以黑客就截取到数据,然后用密钥S把数据解密,就可以看到内容了。
  18. 黑客看完内容后(此时数据泄露了),再用密钥S对数据进行加密后,发送给小丽
  19. 此时小丽收到的数据,其实已经被黑客看过了。
  20. 所以此时,小明和小丽之间的通信已经不安全了。
  21. 这就是中间人攻击的整个过程,黑客就是所谓的那个中间攻,当然也可以是其它任何人。

所以,现在又产生了新的问题了了。可以用一张图来表示
小明和小花,以及老王,也就是本文中的
小明和小丽,以及黑客。这个图是以前做的,也懒得改了。能看懂就行。
img

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算法。

具体过程如下

  1. 小明用md5对数据进行加密,得到一个字符串,我们把这个字符串起个名字叫:摘要
  2. 小明把数据,对应的摘要,都传给小丽
  3. 小丽收到数据摘要后,用md5对数据进行加密,得到摘要2
  4. 对比 摘要摘要2,如果相等,说明数据是完整的,没有被改过。

注:道高一尺,魔高一丈
在验证数据完整性的过程中,如果黑客又参与了呢?

  1. 小明把数据摘要 发给小丽
  2. 黑客截取了数据摘要
  3. 黑客修改数据数据1,然后用md5对数据1加密,生成摘要1
  4. 黑客把数据1摘要1发送给小丽
  5. 小丽收到数据1摘要1后,用md5对数据1进行加密,得到摘要2
  6. 对比 摘要1摘要2,如果相等,说明数据1是完整的,没有被改过。
  7. 结果是相等,小丽以为数据没有被改过,其实已经被黑客改过了的。

上面这个过程,也可以用一张图来表示

依然是我之前写的文章中的配图,只不过名字不太一样,可以看懂即可。
image-20221102153030223

11. 如何解决上面的问题,真正保证数据完整性呢?

答案:签名。

1. 什么是签名?

我们把几个名词放在一起,解释一下,容易说明白。

摘要:md5(或者其它单向加密算法),对数据进行加密出来的字符串,就叫做摘要

签名:小明用私钥对摘要进行加密,加密出来的字符串,就叫做签名

验签:小丽用小明的公钥,对签名进行解密操作,解密出来的摘要和原来的对比,就叫做验签

2. 非对称加密,另外一个作用:身份认证。 如何身份认证?

  1. 小明用md5对数据进行加密,得到摘要
  2. 小明用自己的私钥对摘要进行加密运算得到签名
  3. 小明将 md5, 摘要, 签名一起发送给小丽
  4. 小丽用小明的公钥对签名进行解密,到得信件摘要,假如为 d1
  5. 小丽用md5对信件内容进行运算,得到信件摘要,假如为 d2
  6. 对比 d1 和 d2 是否相等,相等说明信件内容没有被篡改过
  7. d1 和 d2 不相等,说明信件内容被篡改过

此时,这个过程就是安全的了

3. 什么是安全的呢?

比如,黑客又截取到了数据,摘要和md5算法

如果黑客再次截取了信件,黑客可以修改信件内容,再次用md5算出一个新的摘要出来

但是签名,黑客是修改不了的。因为签名是用的小明的私钥加密的,就算黑客能解密出来

黑客是没有办法生成新的签名的,因为小明的私钥只有小明自己有。

而且小丽收到信后,是用小明的公钥进行对签名解密的,黑客假如用自己的私钥对摘要进行加密生成新的签名

小花用小明的公钥是解密不了的。

12. 数字证书是怎么由来的?

答案:数字证书是由CA机构颁发的,比如小明想要一个数字证书,就需要向CA机构申请

13. 数字证书里面包含什么?

  1. 小明的公钥
  2. 颁发者:CA(证书认证机构)
  3. 有效期:证书的使用期限
  4. 摘要算法:指定的摘要算法,用来计算证书的摘要
  5. 指纹:也就是证书的摘要,保证证书的完整性
  6. 签名算法:用于生成签名,确保证书是由CA签发
  7. 序列号:证书的唯一标识

14. 数字证书里面的内容,如何产生?

  1. 将小明的公钥,颁发者,有效期,摘要算法 ,哈希算法写入证书

  2. CA 根据证书中的指定的哈希算法

    对证书整个内容(包含公钥,颁发者,有效期等)用哈希算法计算出整个证书的摘要,即 digest

    也可以叫证书的指纹

  3. CA根据签名算法以及上一步计算出来的摘要

    **CA用自己的私钥对摘要进行加密,生成CA的签名,即 signature ** (记住这句话,后面有用)

  4. 最后把摘要,签名以及证书的基本信息,一起发布,就得到了小明的证书

15. 数字证书如何工作?

从上面的描述我们知道,数据证书就是用来解决公钥传输问题的。

同时我也告诉你,证书其实就是一个文件 。

那么证书是如何解决传输问题的呢?

通过下面几个小问题,我们来一点点揭开证书的工作原理

1. 小丽如何拿到小明的证书?

​ 答:多种方式,比如从网站上下载。

2. 小丽拿到证书后,第一件事要干什么?

​ 答:要验证证书是不是CA发的

​ 解释:因为我们只相信CA是权威的,其它人发的我们认为是不安全的。所以要验证证书是否是CA发的。

3. 小丽如何验证证书是不是CA发的?

答:验签

4. 什么是验签?

答:所谓 验签 : 就好比你对合同中的签名进行签证,到底是不是某个人的真实字迹

​ 证书 - 签名,就类似 : 合同 - 签字

​ 那么验签,就好验证一下,合同中的名字,是不是某个人的真实字迹,验证真的是这个人签的字。

在数字证书里面,验签:就是验证这个数字证书到底是不是CA颁发的。

5. 如何验签?

上面说过:CA用自己的私钥对摘要进行加密,生成CA的签名,即 signature
所以,验签就需要CA的公钥。

​答:验签的步骤:

  1. 小丽用CA的公钥对signature进行密钥,生成摘要 d1
  2. 然后再用证书里面的哈希算法,对证书进行哈希运算,到得摘要d2
  3. 如果 d1 == d2 , 验签通过,说明证书的确是CA颁发的。否则则不是,不安全。

6. 小丽从哪里获取到的CA的公钥?

答:操作系统自带的。

解释:

通过上面,我们知道,公钥在证书里面。

我们去哪里找CA的证书呢?

我们知道,需要证书,就去CA申请,CA会给我们颁发证书

那么CA机构也需要证书,从哪来呢?

其实也是CA颁发的,也就是CA自己给CA颁发证书。

当你安装操作系统的时候(不管是windows,linux,macos,android,ios等)

操作系统里面内置了大量的CA的证书。

所以我们无需关心CA的证书从哪里来。

7. 证书具体怎么工作?

答:步骤如下:

例如:小丽下载到了小明的证书。(相当于互联网里面,客户端从网站服务器那里下载了服务器的证书)

  1. 验签:验证证书是不是CA颁发的。
  2. 如果是CA颁发的。
  3. 看一下证书的所有的者不是小明的。
  4. 如果是,那么小丽就真的拿到了小明的证书
  5. 小明的证书里面, 有小明的公钥。

至此,我们完成了一件事:小丽安全的拿到了小明的公钥

我们先来看看,证书长什么样。在浏览器中打开 www.helloworld.net

我们看一下证书是什么样,如下图

在这里打一个小小的宣传一下我的副业,www.helloworld.net
是由码农兔哥在业余时间开发的一个技术社区
并获得了facebook公司的一个技术大牛的投资
希望大家多多喜欢支持。也可以加兔哥的微信,互相交流技术,吹牛,交朋友。vx: daitukeji

image

16. HTTPS工作的整个流程

通过上面的讲解,我们现在把整个流程串一遍

  1. 小丽下载了小明的证书
  2. 小丽对证书进行验签
  3. 验签通过,的确是CA颁发的
  4. 小丽从证书里面查看一下,证书所有者,的确是小明的。
  5. 小丽从证书里面拿到小明的公钥
  6. 小丽用小明的公钥,协商一个对称加密算法,并把对称算法的密钥S,进行加密得到S1
  7. 小丽把S1发到小明
  8. 小明收到S1,用自己的私钥解密,得到S
  9. 小明用对称加密算法,密钥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

  1. 小丽和小明想安全的通信,怎么办?

    对数据加密

  2. 用哪种加密方式

    对称加密

  3. 密钥S如何安全的传输

    小丽用小明的公钥对S进行加密,发给小明,小明用自己的私钥解密。
    就这样,就传过来了。

  4. 小明的公钥如何安全的传输给小丽?

    用数字证书

  5. 数字证书干什么用的?

用来安全传输公钥用的

  1. 数字证书是谁颁发给小明的?

CA颁发的。具体就是小明向CA申请。

  1. 如何辨别证书是否是CA颁发的?

用CA的公钥,对证书进行验签,通过说明是CA发的。

  1. 小丽如何知道证书是小明的?

证书里面记录的有证书所有者

好了,码字真的好累,自己整理了一天

也是发现其它的文章HTTPS的原理讲的不是很明白。

自己下定决心也写一篇,其它在之前也写过一篇

但是那次写的,觉得还不通透,语言不够简练。

所以这篇文章希望能用更简练的语言,来把HTTPS的原理说明白。

如果你觉得文章对你有用,请点个赞或者转发一下吧,兔哥在此谢谢啦。

posted on 2024-06-03 08:04  HelloWorld开发者社区  阅读(92)  评论(0编辑  收藏  举报