目录
[1 HTTPS是什么?](#1 HTTPS是什么?)
[2 "加密"是什么?](#2 “加密”是什么?)
[3 HTTPS工作过程](#3 HTTPS工作过程)
[3.1 引入对称加密](#3.1 引入对称加密)
[3.2 引入非对称加密](#3.2 引入非对称加密)
[3.2.1 中间人攻击](#3.2.1 中间人攻击)
[3.3 引入证书](#3.3 引入证书)
[3.3.1 理解数字签名](#3.3.1 理解数字签名)
[3.3.2 通过证书解决中间人攻击](#3.3.2 通过证书解决中间人攻击)
1 HTTPS是什么?
前面的章节给大家介绍了http协议以及http请求/响应请求的报文格式。但是我们使用浏览器时,常看到的网络请求的协议是https//:开头的,如:

那么何为https协议呢?https协议实际上是在http协议的基础上做了一些 加密操作,从而保障用户信息安全。因为http协议进行网络交互时,是使用的明文传输,此时会导致用户的数据会很容易地被网络黑客所截取,造成一定的网络安全隐患。
2 "加密"是什么?
⭕**加密:指将未加密的明文 (要传输的数据信息)通过一系列的变换,变成被加密后的密文**。
⭕****解密:指将加密后的密文通过一系列的变换,变成原来的明文。
在加密和解密的过程中,往往需要一些数据来辅助加密/解密的变换过程,这种数据我们把它称为密钥。
3 HTTPS工作过程
要保证数据传输过程的安全性,我们就要对要传输的数据进行"加密",此时网络中就不会再传输明文了,相反,都是通过密文进行数据交互的。加密方式分为 "对称加密" 和 "非对称加密" 。
3.1 引入对称加密
所谓对称加密,就是指客户端和服务器通过同一个密钥进行加密和解密,此密钥称为对称密钥。
🌰举个栗子:
- 通信双方约定,通信的过程都使用对称密钥 key=8888 通过按位异或进行加密解密;
- 假设客户端要传输的数据为1234 通过 1234 ^ key得到密文 9834;
- 服务器收到密文后,通过 9834 ^ key 得到明文 1234;
当然,真正的https进行数据加密的过程肯定没有按位异或这么简单,这里只是举例子让大家更清楚的知道对称加密的特点。
于是,我们可以很清晰地得到客户端与服务器的通信过程,如下:

- 引入对称加密之后,网络攻击者就不能直接获取明文,对用户的信息进行窃取了。
- **❗问题1:**服务器通常是在同一时间针对多个客户端提供服务的,但不同的客户端与服务器进行交互的对称密钥必定是不能相同的,如果每个客户端密钥都相同,那网络黑客直接就能获取密钥了。就好比如果每个人的银行卡密码都相同,那密码也就失去了它的意义。
- 于是服务器就需要维护与每个客户端之间的密钥映射,较为繁琐和麻烦,如下图:

- ❗问题2:要使用对称加密,前提是客户端要将生成好的对称密钥通过网络传输转发给服务器,传输密钥的过程必定是要加密的,就需要设定 " 密钥的密钥 " ,以此类推,不断循环,那就是 " 先有蛋还是先有鸡 " 的问题了。
- 于是我们引入非对称加密......
3.2 引入非对称加密
所谓非对称加密,就是服务器提前生成两个密钥,一个是私钥 ,一个是公钥。
所有客户端包括黑客,都可以拿到公钥,客户端要提前生成对称密钥,通过公钥加密 ,而服务器通过**私钥解密。**而后续客户端与服务器的交互就通过对称加密解密,就可以安全可靠地传输数据了。
此时网络黑客由于拿不到私钥,就无法窃取对称密钥,自然也就无法窃取用户信息了。同时提高了一定的网络安全性。此时客户端与服务器的交互过程如下:

上图过程,可以防止网络黑客直接地窃取对称密钥,但是,狡猾的网络黑客会通过一种 "中间人攻击" 的方式,在客户端与服务器都不知情的情况下间接地获取到对称密钥。
3.2.1 中间人攻击
所谓中间人攻击,就是交互双方之间的中间人通过一系列操作,达到到自己想要的目的。不少谍战片中都有相关的 " 中间人 " 的操作。对于网络通信的过程,中间人攻击的具体过程,如下:
- 服务器生成的 公钥S 私钥S'
- 中间人生成的 公钥M 私钥M'
- 服务器发送给客户端公钥S,但中间人转发给客户端的公钥不是S,而是M。
- 客户端收到M后,将对称密钥通过M加密,发送给中间人,中间人通过自己的私钥M'解密后得到对称密钥。再将对称密钥通过服务器公钥S加密,发送给服务器。
- 服务器通过S'解密后,也得到了对称密钥。
- 问题就出现了,客户端如何才能判断收到的公钥是服务器发来的呢?如果不判断就直接传输对称密钥,会造成严重的网络安全,那此时我们就需要引入证书,来协助客户端识别收到的公钥是否被篡改......
3.3 引入证书
引入证书的目的,是为了辅助客户端识别收到的公钥的合法性。是服务器在使用HTTPS前,提前向CA机构申请一份数字证书,数字证书中包含申请人信息 (签发机构、有效时间、域名、申请人等)和数字签名。
⚠️注意:申请证书的时候,需要在特定的平台生成,同时会生成一对CA机构的公钥和私钥,这对密钥就是用来在网络通信中进行明文加密和数字签名的。
3.3.1 理解数字签名
当服务端申请CA证书的时候,CA机构会对该服务端进行审核,并专门为该网站形成数字签名,过程如下:
- CA机构拥有自己的公钥A,私钥A'
- CA机构对证书中的申请人信息明文数据进行hash,形成数据摘要
- CA机构通过私钥A' 对数据摘要进行加密,生成数字签名。
3.3.2 通过证书解决中间人攻击
✅在客户端和服务器一建立连接之后,服务器就会给客户端返回一个证书,此证书包含了服务器的公钥,也包含了网站的相关信息。
✅客户端拿到证书后,首先判定证书的有效时间是否合法。
✅判定发布机构是否受信任(操作系统内置了已受信任的证书发布机构)
✅验证数字签名的合法性:通过系统得到发布该证书的官方机构的公钥A,通过公钥A对数字签名进行解密,得到一个哈希值 hash1。再计算整个证书的哈希值得到 hash2,比对hash1与hash2,如果相同,则证明证书没有被篡改;反之则被篡改了。
3.3.3 相关面试题的解答
1. 为什么要形成数字签名?
答:数字签名的目的是为了让客户端可以验证服务器发来的公钥的合法性,从而避免中间人攻击窃取对称密钥。
2. 为什么不能直接加密,而要先计算哈希值再加密?
答:计算哈希值是为了缩小签名密文的长度,加快数字签名的验证,以及签名计算的速度。
3. 中间人有没有可能通过篡改证书获取对称密钥?
答:💡中间人篡改证书,由于中间人没有CA机构的私钥,无法对篡改后的计算哈希值进行加密。
💡如果强行篡改,就没办法生成证书信息与数字签名匹配的证书,后续客户端通过验证还是会发现证书不合法。
4. 中间人可以直接掉包证书嘛?
答:💡中间人想掉包证书,由于中间人没有CA机构的私钥,就需要提前向CA机构申请证书。然后用自己申请的证书进行掉包
💡 这个确实能做到证书的整体掉包,但是别忘记,证书明文中包含了域名等服务端认证信息,如果整 体掉包,客户端依旧能够识别出来。
💡 永远记住:中间没人有CA私钥,所以对任何证书都无法进行合法修改,包括自己的。