blog
blog copied to clipboard
图解 HTTPS:Charles 捕获 HTTPS 的原理
前言
这篇文章我准备了很久,反复修改了很多次,仍不觉得满意,原因是:
- 网上虽有很多 HTTPS 相关的资料,但是质量参差不齐,而且有些地方的理解还不一致,我不知道哪个是对的。
- 对于 HTTPS,我很难在实践中应用它,因此,也没法从实践中确认我所理解的就是对的。
下面是我参考的资料,基本代表了我学习 HTTPS 的一个思路顺序:
- 关于互联网流量劫持分析及可选的解决方案, By xrzs
- 密码学笔记, By 阮一峰
- 对称加密算法 VS 非对称加密算法, By loveyoung
- 密码技术系列 Part 1 - 对称加密, By BigNerdCoding
- 如何用通俗易懂的话来解释非对称加密, By ThreatHunter
- XOR 加密简介, By 阮一峰
- RSA算法原理(一), By 阮一峰
- RSA算法原理(二), By 阮一峰
- 数字签名是什么?, By 阮一峰
- 看完还不懂HTTPS我直播吃翔, By winwill2012 🌟 🌟 🌟
- 关于HTTPS,你需要知道的全部, By rushjs
- 深入HTTPS系列一(HTTP&HTTPS), By muice
- HTTPS为什么安全 &分析 HTTPS 连接建立全过程, By kaitoulee
- SSL/TLS协议运行机制的概述, By 阮一峰
- 浅谈Charles抓取HTTPS原理, By rushjs
- Nodejs创建HTTPS服务器, By 张丹
既然网上的文章已经很多,我就不赘述了。凭自己的理解,我画了几张 HTTPS 的图,以求能加深记忆,最后的例子是解释 Charles 捕获 HTTPS 的原理。
图解
误区
我在学习 HTTPS 的时候,发现有几个地方特别容易掉坑里。
- 要想学习 HTTPS,首先应该学习基本的密码学知识,要理解对称加密和非对称加密的数学原理和特性,否则当看到密钥、私钥、公钥等等概念的时候很容易混乱。
- “公钥加密,私钥解密”,这句话是没错,但只说对了一半。公钥和私钥的区分不是以谁加密、谁解密来区分的,是以谁公开、谁不公开为区分的。另外,公钥和私钥,都可以用来加密和解密,也就是说,同一对钥匙,公钥加密只能私钥解密,私钥加密只能公钥解密。那为什么我们平常不说“私钥加密”呢?因为公钥是公开的呀!人手一份公钥,私钥加密不跟没加密一个样吗?因此,在实践中,基本不用私钥进行加密,私钥的用途一般是签名。
- 证书和证书中心。人们常说:“要想进行 HTTPS 通信,就要安装证书”。这句话未免说得太笼统,我觉得,应该刻意地区分开证书和证书中心,下面以 Charles 为例讲讲。
-------------- 完 --------------
那Charles 的方式也算作做是一种显示的劫持了。
@Thinking80s 本质就是劫持。不过要强调的是:之所以能劫持,并不是因为 HTTPS 不安全,而是因为操作人主动安装信任了 Charles 根证书中心。
@Thinking80s https的抓包,是因为你安装了charles的证书,这个时候charles即充当了客户端也充当了服务端
太棒啦,好清晰,解惑啦!
为什么都是苑一峰的文章, 百度自己就有很大介绍https的东西。
数字证书那张图的第11步是不是用服务器私钥解密?
对,第11步写错了,应为“用服务器私钥解密,得到会话密钥”。感谢指正,已更正。 @silif
“公钥加密,私钥解密”,这句话是没错,但只说对了一半。公钥和私钥的区分不是以谁加密、谁解密来区分的,是以谁公开、谁不公开为区分的。另外,公钥和私钥,都可以用来加密和解密,也就是说,同一对钥匙,公钥加密只能私钥解密,私钥加密只能公钥解密。那为什么我们平常不说“私钥加密”呢?因为公钥是公开的呀!人手一份公钥,私钥加密不跟没加密一个样吗?因此,在实践中,基本不用私钥进行加密,私钥的用途一般是签名。
这段话把我看的有点懵
非常清晰,感谢分享! start持续关注
对,第11步写错了,应为“用服务器私钥解密,得到会话密钥”。感谢指正,已更正。
图中红字更正的还是:得到会话私钥。 是不是应该是:得到会话秘钥。
@maquannene 你说得对,图更新错了,现在已经重新更新了。看得好仔细,感谢指正。
@youngwind 传播知识,心存敬畏。
看到的最容易理解的版本👍
图文并茂, 简洁明了, 大大加深了对 HTTPS 的理解, 也纠正了之前的一些误区。
好文。最后一张图,第7步“用服务器公钥加密,发送给服务器”,这个“服务器公钥匙怎么来的呢?”最好在第3步的时候说明一下charles拦截响应获取了来自服务器的公钥
客户端取得证书后解开得到域名,hash等信息,校验hash可以判断内容是否被修改过?这是什么意思,如何校验这个hash?
真是一图胜千言,记忆模糊的时候拿出来一看就又明白了。
有个地方字打错了,提醒一下
判断是baidu的域名,根据charles自己的公钥和baidu的域名,生成正式
这句里的“正式”应该是“证书” 这个地方还挺重要的,解释了为什么能通过证书域名的匹配
写的很不错,我写了一篇“用故事说透HTTPS” https://mp.weixin.qq.com/s/MfvUuitrF8MN16nxyZNB8A
学到了很多。所以日常的抓包工具 Charles 或者 Fiddler 在要抓取 HTTPS 包之前都需要安装 "证书",这个"证书"更准确的说法应该是:安装 Charles 证书中心 或者 Fiddler 证书中心。因为客户端收到的动态证书是来自代理工具 Charles、Fiddler 生成的证书,而不是服务器本身的证书。所以在客户端就需要通过 Charles 或者 Fiddler 证书中心用私钥去解密证书!
赞
写的很不错,我写了一篇“用故事说透HTTPS” https://mp.weixin.qq.com/s/MfvUuitrF8MN16nxyZNB8A
哈哈 写的也不错~ 通俗易懂 两篇各有风格~