Rennen

Rennen

HTTPS 是如何做到防篡改和防窃听的?

2025-08-17

问题 1:非对称加密和对称加密的区别?

非对称加密,加密和解密用的密钥是同一把;对称加密,分为公钥和私钥,其中私钥不能泄漏,公钥可以随便获取。使用一把密钥加密,就只能使用另一把密钥解密。


问题 2:HTTPS 建立连接到传输数据的全过程?

image.png

image.png

如果上面的图太复杂不想看,可以看下下面精简版的流程。假设客户端是建立连接方,RSA 方式,细节暂不展开。

  1. 握手阶段
    1. 先进行 TCP 握手,整个过程就是 TCP 的三次握手
    2. 后进行 TLS 握手,这部分主要利用的是非对称加密
      1. Client Hello,发送TLS 版本、加密算法、随机数 1
      2. Server Hello,发送 TLS 版本,加密算法,随机数 2,证书链
      3. 客户端验证服务端的证书链,检查是否伪造,如果通过检查,那么就从中提取公钥,自己再生成一个随机数(预主密钥),用公钥加密,发送给服务端
      4. 这个时候,服务端和客户端各自都拥有三个相同的随机数,结合相同的算法,生成一个会话密钥,用于接下来的通信
  2. 建立连接后,接下来的通信,双方不再使用非对称加密,而是使用会话密钥,对称加密来传输数据。

问题 3:为什么 TLS 过程中服务端和客户端都需要生成随机数组成会话密钥?只有一方生成随机数不行吗?

一般的随机数生成算法和系统时间强相关,因此双方都生成随机数可以增强随机性,提高安全性。


问题 4:为什么不全程使用非对称加密,而是既使用非对称加密,又使用对称加密?

非对称加密对硬件要求高,而对称加密对硬件要求低,可以减轻设备的压力。

其实还有一个原因,就是只使用非对称加密,服务端给客户端发送的数据可能会被中间人窃听,因为公钥是所有人都可以获取到的。

而对称加密的会话密钥的生成,需要客户端生成随机数,使用可信公钥加密,得到预主密钥发送给服务端,服务端使用私钥解密才能得到完整的会话密钥。

这也是为什么,在下表中,对称加密的主要用途为加密,而非对称加密的主要用途为签名和传递密钥。

image.png


问题 5:什么是中间人攻击?

这里拿非对称加密的过程来解释中间人攻击:

  1. 服务端向客户端发送公钥,这个时候公钥被中间人截获;
  2. 中间人自己生成了一对新的公钥和私钥,并将新的公钥发送给客户端;
  3. 客户端使用中间人的公钥加密自己生成的预主密钥,发送给中间人;
  4. 中间人这个时候就可以通过自己的私钥来解密,得到预主密钥;
  5. 中间人将预主密钥使用服务端公钥加密,发送给服务端。

在这个过程中,不管是客户端还是服务端,都不能感知到中间人的存在,整个链路是不安全的。

因此得出结论,单靠非对称加密不能保证绝对的安全性,必须还要验证公钥的真实性,也就引出下面的问题 ↓


问题 6:客户端如何判断接收到的公钥一定是来自服务端的公钥,而不是中间人的公钥?

使用数字证书和数字签名进行验证。在 TLS 握手的过程中,客户端会收到服务端颁发的证书链,客户端会验证证书的真实性,如下所示(这张图是自己原创的😃):
image.png

通过浏览器可以查看到网站证书的证书链:
image.png


问题 7:为什么服务端的证书不直接由根证书的 CA 机构颁发,还要搞个证书链层层颁发证书?

目的同样是为了增强安全性。根 CA 颁发证书的过程中利用了根 CA 自己的私钥。如果该私钥泄漏,那么任何人都可以给自己颁发证书,相当于所有已经颁发过的证书都失去了身份验证的效力。为了将这种影响降到最小,根 CA 往往只给其他 CA 颁发证书,不直接给网站颁发证书。证书机构自签一张新的根证书时,需要产生一对公开密钥及私有密钥,这个过程在公证人、律师及录影系统监察下经过一系列严谨的程序,在高度防护的设施内进行。


问题 8:CA 机构为什么能够担保网站身份的真实性?换句话说,CA 机构在为证书申请者颁发证书的时候是如何验证申请者的身份的?

拿现在流行的 ACME Challenge 申请 DV(Domain Validation) 证书来举例。

ACME Challenge(自动化证书管理环境挑战)是由 Let’s Encrypt 和其他提供 ACME 协议的证书颁发机构(CA)广泛采用的一种方式,用于验证域名的所有权。

验证过程:

  1. 申请者向 CA 机构发起证书签名请求
  2. CA 机构生成一个挑战字符串
  3. 申请者可以将该挑战字符串放在自己网站的指定路径中,例如:http://example.com/.well-known/acme-challenge/{TOKEN},也可以在网站 DNS 配置中添加一条 TXT 记录,存放挑战字符串
  4. CA 机构查询挑战字符串并进行比对,为了避免查询结果被劫持或篡改,这一步 CA 机构会从多个网络位置访问验证

总结以上流程,如果申请者能够完成 ACME Challenge,那么当然可以证明网站归证书申请者所有。另外,一些高级的证书(例如 OV、EV)会要求更复杂的验证方式,例如要求申请人提供企业的营业执照、出具证明信等等,因此安全性更高,收费也更贵,证书有效期可能也更长。


问题 9:通过数字证书和数字签名,客户端能够验证服务端的身份,那么反过来,服务端如何验证客户端的身份?

  1. 通过请求携带的 密码、Cookie、JWT 等方式验证;
  2. 使用双向证书进行验证,即客户端请求的时候也携带自己的证书,这种方式比较适合云原生基础架构中不同节点的通信。

参考资料: