Skip to main content

第 7 课:HTTPS 协议

(一)HTTPS 加密原理

假设 A 和 B 已经建立了通信通道,但是不能直接连接,必须经过中间人。那么该如何保证信息不在中途被修改或者监听呢?

我们假设把信息锁到一个盒子里,这个盒子就是 “加密方式”,我们需要 秘钥 来解密(打开盒子)。

1. 对称加密

我们开始想到使用 对称加密(加密和解密用的是同一个秘钥)。但是问题在于,所有的信息都需要通过中间人传递,包括这把秘钥。因此中间人获得这把秘钥之后,通信就不再安全了。


2. 非对称加密

非对称加密,比如用 A秘钥 加密 就要用 B 秘钥解密,反之亦然。

首先把 秘钥B 发给对象,让她发消息时使用秘钥 B 来加密。如此一来,即使中间人复制了一份 秘钥 B, 也无法解密,因为解密用的 A 秘钥你没有给任何人。

这里的 秘钥 A 被称为 私钥,秘钥 B 被称为 公钥。公钥加密,私钥解密。

image-20250907171157790

但是这样就有一个问题,作为私钥的持有者,你无法向外发送加密信息。

因此我们想到 用非对称加密方法去传递 对称加密的秘钥,后面都用对称加密来通话,详细流程如下:

  1. 让 女生 准备一把 对称加密秘钥 M
  2. 把 公钥B 发送给 男生,对象用 公钥B 来加密 秘钥M,传回来
  3. 用 私钥A 解锁获得 秘钥M,然后使用 私钥M 对称加密通信

image-20250907171659954


3. 中间人攻击

普通的非对称加密有个漏洞!在男生发送 公钥 B 的时候,公钥 B 可能会被中间人替换!

如下图,中间人直接用一把 伪造的对称加密秘钥 B 替换了原本的 秘钥 B,这样 女生使用的其实是 伪造的对称加密秘钥 B ,也就是可以被中间人解码获得 对称加密秘钥 M

image-20250907172423728

此后,中间人把获得的 对称加密秘钥 M 使用男生发来的 公钥B 重新加密,并发送给男生,从而难以被男生发现。

image-20250907172445476

回顾这个流程,核心的问题在于 发送的公钥B 可以被修改,那有没有什么办法可以让公钥 B 可以被看见,但是无法修改呢?

有的,用私钥加密,公钥解密

加密方式功能
公钥加密,私钥解密防偷看
私钥加密,公钥解密防纂改

防纂改是因为中间人用公钥解密后,不知道私钥,因此无法再次加密。

思考:中间人是否可以直接拦截这个包,并把已经有的公钥 当成另一个对称加密算法的密钥,然后重新对纂改后的解密内容使用对称加密,这样一来,接收方用公钥解密的其实是一个对称加密后的假数据?

A -- 私钥A加密过的内容 -> 中间人用公钥B解密 -> 将假内容用公钥B 对称加密 -> B 用公钥B 对称解密

事实上这是不可行的,因此 对称加密 的算法和 非对称算法不一样,B 不可能会用 公钥B 去对称解密,而是会分对称解密。因此使用对称算法 和 公钥 B 加密后的算法,接收方 是解密不出来的。

具体流程如下:

步骤图示
准备两套非对称加密,分别是(私钥A,公钥B)和 (私钥C,公钥D)image-20250907173618500
先传递公钥 Dimage-20250907173706735
用 私钥C 加密公钥 Bimage-20250907173958498
女生后用公钥 D 解密获得公钥 Bimage-20250907173939313

现在女生获得了公钥 B,这是无法被修改的,原因如下:

中间人有公钥 D, 可以解密看到 公钥 B。但是如果中间人要篡改 公钥B 的内容,就必须用私钥 C 重新加密,可是 私钥 C 从来没有被公布过,因此 中间人无法修改 公钥B。

因此 私钥加密 通常被称为 “签名”, 公钥解密则被称为 “验证签名”

但是第一次传输的公钥D 也会有被篡改的风险!这个问题无法解决,必须依靠可信的第三方,这就是最终的 HTTPS 加密方法。


4. HTTPS 加密

详细步骤如下:

步骤图示
先把公钥B 传递给一个可信的第三方机构CA,这个机构自己也有一套公钥 Y 和 私钥 Ximage-20250907174835187
第三方使用自己的私钥X公钥B 进行加密,也就是进行了一个数字签名。重新发给男生image-20250907174939469
男生把用 私钥X 加密过的 公钥B ,和未加密的 公钥B 都发给女方,女方用第三方的公钥Y 解密,对比两个公钥 B 是否相同image-20250907175112343

仔细思考,其实就是把 用自己的私钥C 进行签名 改成了 用第三方机构的私钥Y 进行签名

那么问题就来了,凭什么中间人不能伪造第三方的公钥,从而实现之前那样的公钥替换呢?

其实是可以的,但是中间人生成的公钥不具备可信度。只要接收方多一步验证环节,比如去查一下这个公钥属于哪家机构,就会发现这个公钥是假的,从而拒绝通信。

我们把这个第三方机构称为 CA(证书颁发机构)。这一套加密流程就是 HTTPS 协议



(三)浏览器中使用设备

摄像机、麦克风等设备,如果想要在 HTML 中直接请求访问设备(调用远程 API),需要是 Local Host 或者是 HTTPS

如果想要绕过 HTTPS,有两种策略:

  1. 在客户端也发起服务,变成两个服务端之间的 API 通信

  2. 临时解决方案

    • 在Chrome中访问

      chrome://flags/#unsafely-treat-insecure-origin-as-secure
    • 添加 http://test.heihet09.com 到允许列表

    • 重启浏览器