Skip to content

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

Open
@youngwind

Description

@youngwind
Owner

前言

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

  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

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

Activity

Thinking80s

Thinking80s commented on Aug 5, 2017

@Thinking80s

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

youngwind

youngwind commented on Aug 5, 2017

@youngwind
OwnerAuthor

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

wangning0

wangning0 commented on Aug 5, 2017

@wangning0

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

angellaugh

angellaugh commented on Sep 7, 2017

@angellaugh

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

aaawhz

aaawhz commented on Oct 11, 2017

@aaawhz

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

silif

silif commented on May 16, 2018

@silif

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

youngwind

youngwind commented on May 16, 2018

@youngwind
OwnerAuthor

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

zhouatie

zhouatie commented on Jun 12, 2018

@zhouatie

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

这段话把我看的有点懵

vevlins

vevlins commented on Aug 19, 2018

@vevlins

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

maquannene

maquannene commented on Aug 30, 2018

@maquannene

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

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

youngwind

youngwind commented on Aug 31, 2018

@youngwind
OwnerAuthor

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

15 remaining items

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @Thinking80s@lc87624@zirconnnn@aaawhz@huopochuan

        Issue actions

          图解 HTTPS:Charles 捕获 HTTPS 的原理 · Issue #108 · youngwind/blog