Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

图解 HTTPS:Charles 捕获 HTTPS 的原理 #108

Open
youngwind opened this issue Aug 3, 2017 · 20 comments
Open

图解 HTTPS:Charles 捕获 HTTPS 的原理 #108

youngwind opened this issue Aug 3, 2017 · 20 comments

Comments

@youngwind
Copy link
Owner

@youngwind youngwind commented Aug 3, 2017

前言

这篇文章我准备了很久,反复修改了很多次,仍不觉得满意,原因是:

  1. 网上虽有很多 HTTPS 相关的资料,但是质量参差不齐,而且有些地方的理解还不一致,我不知道哪个是对的。
  2. 对于 HTTPS,我很难在实践中应用它,因此,也没法从实践中确认我所理解的就是对的。

下面是我参考的资料,基本代表了我学习 HTTPS 的一个思路顺序:

  1. 关于互联网流量劫持分析及可选的解决方案, By xrzs
  2. 密码学笔记, By 阮一峰
  3. 对称加密算法 VS 非对称加密算法, By loveyoung
  4. 密码技术系列 Part 1 - 对称加密, By BigNerdCoding
  5. 如何用通俗易懂的话来解释非对称加密, By ThreatHunter
  6. XOR 加密简介, By 阮一峰
  7. RSA算法原理(一), By 阮一峰
  8. RSA算法原理(二), By 阮一峰
  9. 数字签名是什么?, By 阮一峰
  10. 看完还不懂HTTPS我直播吃翔, By winwill2012 🌟 🌟 🌟
  11. 关于HTTPS,你需要知道的全部, By rushjs
  12. 深入HTTPS系列一(HTTP&HTTPS), By muice
  13. HTTPS为什么安全 &分析 HTTPS 连接建立全过程, By kaitoulee
  14. SSL/TLS协议运行机制的概述, By 阮一峰
  15. 浅谈Charles抓取HTTPS原理, By rushjs
  16. Nodejs创建HTTPS服务器, By 张丹

既然网上的文章已经很多,我就不赘述了。凭自己的理解,我画了几张 HTTPS 的图,以求能加深记忆,最后的例子是解释 Charles 捕获 HTTPS 的原理。

图解

image1

image2

image3

image4

image5

image

image7

误区

我在学习 HTTPS 的时候,发现有几个地方特别容易掉坑里。

  1. 要想学习 HTTPS,首先应该学习基本的密码学知识,要理解对称加密和非对称加密的数学原理和特性,否则当看到密钥、私钥、公钥等等概念的时候很容易混乱。
  2. “公钥加密,私钥解密”,这句话是没错,但只说对了一半。公钥和私钥的区分不是以谁加密、谁解密来区分的,是以谁公开、谁不公开为区分的。另外,公钥和私钥,都可以用来加密和解密,也就是说,同一对钥匙,公钥加密只能私钥解密,私钥加密只能公钥解密。那为什么我们平常不说“私钥加密”呢?因为公钥是公开的呀!人手一份公钥,私钥加密不跟没加密一个样吗?因此,在实践中,基本不用私钥进行加密,私钥的用途一般是签名。
  3. 证书和证书中心。人们常说:“要想进行 HTTPS 通信,就要安装证书”。这句话未免说得太笼统,我觉得,应该刻意地区分开证书和证书中心,下面以 Charles 为例讲讲。
    image

-------------- 完 --------------

@Thinking80s
Copy link

@Thinking80s Thinking80s commented Aug 5, 2017

那Charles 的方式也算作做是一种显示的劫持了。

@youngwind
Copy link
Owner Author

@youngwind youngwind commented Aug 5, 2017

@Thinking80s 本质就是劫持。不过要强调的是:之所以能劫持,并不是因为 HTTPS 不安全,而是因为操作人主动安装信任了 Charles 根证书中心。

@wangning0
Copy link

@wangning0 wangning0 commented Aug 5, 2017

@Thinking80s https的抓包,是因为你安装了charles的证书,这个时候charles即充当了客户端也充当了服务端

@angellaugh
Copy link

@angellaugh angellaugh commented Sep 7, 2017

太棒啦,好清晰,解惑啦!

@aaawhz
Copy link

@aaawhz aaawhz commented Oct 11, 2017

为什么都是苑一峰的文章, 百度自己就有很大介绍https的东西。

@silif
Copy link

@silif silif commented May 16, 2018

数字证书那张图的第11步是不是用服务器私钥解密?

@youngwind
Copy link
Owner Author

@youngwind youngwind commented May 16, 2018

对,第11步写错了,应为“用服务器私钥解密,得到会话密钥”。感谢指正,已更正。 @silif

@zhouatie
Copy link

@zhouatie zhouatie commented Jun 12, 2018

“公钥加密,私钥解密”,这句话是没错,但只说对了一半。公钥和私钥的区分不是以谁加密、谁解密来区分的,是以谁公开、谁不公开为区分的。另外,公钥和私钥,都可以用来加密和解密,也就是说,同一对钥匙,公钥加密只能私钥解密,私钥加密只能公钥解密。那为什么我们平常不说“私钥加密”呢?因为公钥是公开的呀!人手一份公钥,私钥加密不跟没加密一个样吗?因此,在实践中,基本不用私钥进行加密,私钥的用途一般是签名。

这段话把我看的有点懵

@vevlins
Copy link

@vevlins vevlins commented Aug 19, 2018

非常清晰,感谢分享!
start持续关注

@maquannene
Copy link

@maquannene maquannene commented Aug 30, 2018

对,第11步写错了,应为“用服务器私钥解密,得到会话密钥”。感谢指正,已更正。

图中红字更正的还是:得到会话私钥。
是不是应该是:得到会话秘钥。

@youngwind
Copy link
Owner Author

@youngwind youngwind commented Aug 31, 2018

@maquannene 你说得对,图更新错了,现在已经重新更新了。看得好仔细,感谢指正。

@maquannene
Copy link

@maquannene maquannene commented Aug 31, 2018

@youngwind 传播知识,心存敬畏。

@jialinhome
Copy link

@jialinhome jialinhome commented Nov 22, 2018

看到的最容易理解的版本👍

@ZexiFangkong
Copy link

@ZexiFangkong ZexiFangkong commented Mar 20, 2019

图文并茂, 简洁明了, 大大加深了对 HTTPS 的理解, 也纠正了之前的一些误区。

@gaopeng0108
Copy link

@gaopeng0108 gaopeng0108 commented May 8, 2019

好文。最后一张图,第7步“用服务器公钥加密,发送给服务器”,这个“服务器公钥匙怎么来的呢?”最好在第3步的时候说明一下charles拦截响应获取了来自服务器的公钥

@zirconnnn
Copy link

@zirconnnn zirconnnn commented Aug 2, 2019

客户端取得证书后解开得到域名,hash等信息,校验hash可以判断内容是否被修改过?这是什么意思,如何校验这个hash?

@lc87624
Copy link

@lc87624 lc87624 commented Oct 22, 2019

真是一图胜千言,记忆模糊的时候拿出来一看就又明白了。

有个地方字打错了,提醒一下

判断是baidu的域名,根据charles自己的公钥和baidu的域名,生成正式

这句里的“正式”应该是“证书”
这个地方还挺重要的,解释了为什么能通过证书域名的匹配

@lefex
Copy link

@lefex lefex commented Dec 9, 2019

写的很不错,我写了一篇“用故事说透HTTPS” https://mp.weixin.qq.com/s/MfvUuitrF8MN16nxyZNB8A
WechatIMG85

@sfsoul
Copy link

@sfsoul sfsoul commented Apr 21, 2020

学到了很多。所以日常的抓包工具 Charles 或者 Fiddler 在要抓取 HTTPS 包之前都需要安装 "证书",这个"证书"更准确的说法应该是:安装 Charles 证书中心 或者 Fiddler 证书中心。因为客户端收到的动态证书是来自代理工具 Charles、Fiddler 生成的证书,而不是服务器本身的证书。所以在客户端就需要通过 Charles 或者 Fiddler 证书中心用私钥去解密证书!

@huopochuan
Copy link

@huopochuan huopochuan commented May 14, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
You can’t perform that action at this time.