很多人讲不明白HTTPS,但是我能
很多人讲不明白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的原理说明白。
如果你觉得文章对你有用,请点个赞或者转发一下吧,兔哥在此谢谢啦。
很多人讲不明白HTTPS,但是我能的更多相关文章
- 为什么很多人坚信“富贵险中求”?
之家哥 2017-11-15 09:12:31 微信QQ微博 下载APP 摘要 网贷之家小编根据舆情频道的相关数据,精心整理的关于<为什么很多人坚信"富贵险中求"?>的 ...
- 我曾经用“UC震惊部”震碎了很多人的三观
Hi,欢迎大家在有空的时候做客[江涛学编程],这里是2023年的第9篇原创文章,今天写的这篇是当事人对昨天上热搜的统一回复. 我没有曾经跨过山河大海,我也没有曾经穿越人山人海,但我曾经用"U ...
- 很多人都在埋怨没有遇到好的团队,但好的团队不可能凭空出现,一流的团队不能仅靠团队成员努力,作为Leader,要有可行的规划,并坚定地执行、时势地调整(转)
<西游记>中的唐僧团队历经千难万险,终于求得真经,目标明确.分工合理为这支队伍最终走向成功奠定了基础.唐僧从一开始,就为这个团队设定了西天取经的目标,虽然经历各种挫折与磨难,但目标从未动摇 ...
- 神贴真开眼界:为什么很多人倡导重视能力和素质,但同时对学历有严格要求?——代表了上一场比赛的输赢,招聘成本很重要。如果上一场游戏失败了,尽量让自己成为当前群体的尖子。学历只是其中的一个作品而已,但学历代表了学生时代为之做出的牺牲。人群自有偏向集中性 good
对于软件工程师职位,没学历没关系,如果真觉得自己才高八斗,请在简历里附上 github项目链接或者 appstore/google play上你的作品.如果学历比别人低,那么想必是把时间和精力用在了其 ...
- 很多人以为 connect 和 disconnect 应该像 new 和 delete 一样成对出现 这是错误的(只要 sender 或 receiver 其中之一不存在了,connect 会自动失效。QObject::connect 函数是线程安全的)
其实我写文章也是边查资料边编辑的 有时候是怕自己的阐述不严谨,有时候是怕自己重复造轮子 就像有些人不停的教大家QLabel QDialog QWidget 个人是不屑的 命令模式 用 Qt's Und ...
- 一道简单的 Java 笔试题,但值得很多人反思!
前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要 ...
- 近日让很多人议论纷纭的P++,PHP新分支?
最近大家可能有看到一个新的名词——P++. 很巧这个词来源于不久前从 Zend 公司离职的 Zeev Suraski 以 PHP 开发组成员的身份提议要创建 PHP 方言,暂命名为 P++. 老兄最近 ...
- 很多人都搞不清楚C语言和C++的关系!今天我们来一探究竟为大家解惑~
最近,身边有许多小伙伴已经开始学习编程了,但是呢,学习又会碰到许多的问题,其中作为新手小白提到最多的问题就是编程语言的选择. 每次遇到这种问题,看起来很简单,但是又有很多小伙伴搞不清编程语言之间的关系 ...
- 上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?
今天群里有人聊图片上传,简单说下自己的经验(大牛勿喷) 0.如果你的方法里面是有指定路径的,记得一定要过滤../,比如你把 aa文件夹设置了权限,一些类似于exe,asp,php之类的文件不能执行,那 ...
- 我来科普一下为毛很多人升级了20M的电信光纤宽带反而感觉速度更卡了
下载(在线看视频,看网页,下载游戏这类都是属于下载类应用) 为毛很多人升级20M光纤更慢了呢? 因为电信对你的上传速度做了手脚, 8M以及以上家用光纤宽带全部上传限速到100KB/s 也就是1M带宽 ...
随机推荐
- Go 单元测试之mock接口测试
目录 一.gomock 工具介绍 二.安装 三.使用 3.1 指定三个参数 3.2 使用命令为接口生成 mock 实现 3.3 使用make 命令封装处理mock 四.接口单元测试步骤 三.小黄书Se ...
- 如何解决python安装mysqlclient失败问题
在使用Django等框架来操作MySQL时,实际上底层还是通过Python来操作的,首先需要安装一个驱动程序,在Python3中,驱动程序有多种选择,比如有pymysql以及mysqlclient等. ...
- 离线语音识别,vosk,离线流式实时静音噪声监测,支持多语言开发python c++ c# java等
#!/usr/bin/env python3 from vosk import Model, KaldiRecognizer, SetLogLevel import sys import os imp ...
- Kafka 集群副本数量调整
Kafka 创建时未指定多个副本或者副本数量过少,都可以在后期手动添加,另外如果副本过多也可以减少,当前调整基于 Kafka 的版本是 2.5.1,但是估计 2.1 ~ 2.5 应该都是兼容的. 下面 ...
- 【Oracle】 管道函数pipelined function简单的使用
Oracle 管道函数pipelined function简单的使用 如果在函数(function)中加关键字 pipelined,就表明这是一个oracle管道函数,其返回值类型必为 集合,体现出来 ...
- 通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)
1f45bd1e8577af66a05f5e3fadb0b29 通过ORPO对llama进行微调 前言 ORPO是一种新颖的微调技术,它将传统的监督微调和偏好对齐阶段整合到一个过程中.这减少了训练所需 ...
- PeLK:101 x 101 的超大卷积网络,同参数量下反超 ViT | CVPR 2024
最近,有一些大型内核卷积网络的研究,但考虑到卷积的平方复杂度,扩大内核会带来大量的参数,继而引发严重的优化问题.受人类视觉的启发,论文提出了外围卷积,通过参数共享将卷积的复杂性从 \(O(K^{2}) ...
- MySQL统计信息不准导致的性能问题
简介: 统计信息不准导致错误的执行计划,引发性能问题 表的统计信息错误导致优化器选择错误的执行计划. 一个客户的性能优化案例: 没有修改数据库实例的任何配置参数以及业务代码没有变更的情况下,一条 sq ...
- 阿里云2020上云采购季,你的ECS买好了吗?
阿里云2020上云采购季,超级品类日,天天有爆款. 今日爆款推荐:云服务器. 重磅推荐两款,限时抢购. 新品共享型s6: 企业级共享型n4: 想看更多云产品,来阿里云采购季: https://www. ...
- 迁移 Express 到函数计算
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准备计 ...