很多人讲不明白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带宽 ...
随机推荐
- 单点登录(SSO)实现详解!!!
单点登录是什么?你是怎么理解的?单点登录是如何实现的 普通登录 提到单点登录,首先可以想到传统登录,通过登录页面根据用户名查询用户信息,判断密码是否正确,正确则将用户信息写到session,访问的时候 ...
- 【Oracle】使用PL/SQL快速查询出1-9数字
[Oracle]使用PL/SQL快速查询出1-9数字 简单来说,直接Recursive WITH Clauses 在Oracle 里面就直接使用WITH result(参数)即可 WITH resul ...
- 牛客网-SQL专项训练18
①在下列sql语句错误的是?B 解析: 在sql中若要取得NULL,则必须通过IS NULL或者IS NOT NULL进行获取,无法直接使用等号. 一个等号(=)表示把1赋值给变量啊 ==:称为等值符 ...
- BladeDISC 0.2.0更新发布
简介:在BladeDISC正式开源三个月后,我们发布了0.2.0版本,该更新包含了大量的性能优化与功能增强. 在BladeDISC正式开源三个月后,我们发布了0.2.0版本,该更新包含了大量的性能优 ...
- 云企业网CEN-TR打造企业级私有网络
简介: 为了满足企业大规模.多样化的组网和网络管理需求,云企业网(CEN)提出了转发路由器TR(Transit Router)的概念.在每个地域内创建一个转发路由器,可以连接大量VPC.VBR,作为您 ...
- MySQL 深潜 - MDL 锁的实现与获取机制
简介:本文将介绍在 MDL 系统中常用的数据结构及含义,然后从实现角度讨论 MDL 的获取机制与死锁检测,最后分享在实践中如何监控 MDL 状态. 作者 | 泊歌 来源 | 阿里技术公众号 一 背 ...
- SAE助力「海底小纵队学英语」全面拥抱Serverless,节省25%以上成本
简介: 阿里云Serveless应用引擎SAE 具备免运维IaaS.按需使用.按量计费.低门槛服务应用上云,并且支持多种语言和高弹性能力等特点,刚好完美解决了客户长期以来运维复杂.资源利用率不高.开发 ...
- Flink 和 Pulsar 的批流融合
简介: 如何通过 Apache Pulsar 原生的存储计算分离的架构提供批流融合的基础,以及 Apache Pulsar 如何与 Flink 结合,实现批流一体的计算. 简介:StreamNativ ...
- Flink+Hologres亿级用户实时UV精确去重最佳实践
简介: Flink+Hologres亿级用户实时UV精确去重最佳实践 UV.PV计算,因为业务需求不同,通常会分为两种场景: 离线计算场景:以T+1为主,计算历史数据 实时计算场景:实时计算日常新增的 ...
- 博时基金基于 RocketMQ 的互联网开放平台 Matrix 架构实践
简介: Matrix 经过一年多的建设,目前已具备多渠道统一接入.第三方生态互联互通.基金特色交易场景化封装等功能特性.Matrix 通过建设有品质.有温度的陪伴,从技术上和体验上,让用户理解风险,理 ...