> For the complete documentation index, see [llms.txt](https://xiaobaiha.gitbook.io/tech-share/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://xiaobaiha.gitbook.io/tech-share/engineering/https.md).

# HTTPS

## 传输层安全

* 数据不被窃听
* 数据不被篡改
* 身份验证

## 加密

* 对称加密

密钥双方存有，都可以进行加密和解密，如果密钥泄漏了，那么就相当于泄密了。

* 非对称加密

密钥分为两种，一种为公钥，公钥公开，所有人都可获取；另一种为私钥，不可被别人获取。加密时使用公钥进行加密，解密时使用私钥进行解密。

## SSL 原理

如果使用非对称加密，A 和 B 要通过网络交换 public key。如果中间人 C 在中间拦截了呢？ 假设有这种情况，C 拦截了 A 和 B 的 public key，又分别用自己的 public key 发给 A 和 B。A 和 B 并不知道，他们还以为这个 public key 来自对方。当 A 给 B 发消息时，A 先用自己的 private key 加密数据的 hash 值，之后用 C 传来的假的 public key 加密数据，再发出去。C 拦截到之后，先用 C 自己的 private key 解密数据，C 就获取了 A 的原始信息。 之后，C 可以篡改数据内容，再用自己的 private key 加密数据的 hash 值，用之前拦截的 B 的 public key 加密数据，再发给 B。B 收到以后，先用自己的 private key 解密数据，再用 C 传来的假 public key 解密 hash 值，发现匹配。这样，B 收到了一条来自 C 的假的信息，但是 B 还以为信息来自于 A。中间人攻击仍然可能存在。 问题出就出在最开始通过网络交换 public key。看起来为了保证 public key 不被拦截，A 和 B 似乎还是要见一面，交换一下 public key。这一下就回到了上古时代。不过，虽然 A 和 B 现在还是要见一面，但见面的实质已经变了。在上古时代，见面是为了商量一个密钥，密钥的内容很重要，不能让别人知道密钥的内容。而在现代，见面是为了确认 public key 的真实性，public key 的内容是可以公开的。那如果有其他办法能保证 public key 的真实性，A 和 B 是可以不用见面交换 public key 的。

### CA

现实中，通过 CA（Certificate Authority）来保证 public key 的真实性。CA 也是基于非对称加密算法来工作。有了 CA，B 会先把自己的 public key（和一些其他信息）交给 CA。CA 用自己的 private key 加密这些数据，加密完的数据称为 B 的数字证书。现在 B 要向 A 传递 public key，B 传递的是 CA 加密之后的数字证书。A 收到以后，会通过 CA 发布的 CA 证书（包含了 CA 的 public key），来解密 B 的数字证书，从而获得 B 的 public key。

CA 的大杀器就是，CA 把自己的 CA 证书集成在了浏览器和操作系统里面。A 拿到浏览器或者操作系统的时候，已经有了 CA 证书，没有必要通过网络获取，那自然也不存在劫持的问题。现在 A 和 B 都有了 CA 认证的数字证书。在交换 public key 的阶段，直接交换彼此的数字证书就行。而中间人 C，还是可以拦截 A 和 B 的 public key，也可以用 CA 证书解密获得 A 和 B 的 public key。但是，C 没有办法伪造 public key 了。因为 C 不在 CA 体系里面，C 没有 CA 的 private key，所以 C 是没有办法伪造出一个可以通过 CA 认证的数字证书。如果不能通过 CA 认证，A 和 B 自然也不会相信这个伪造的证书。所以，采用 CA 认证以后，A 和 B 的 public key 的真实性得到了保证，A 和 B 可以通过网络交换 public key（实际是被 CA 加密之后的数字证书）。

实际使用非对称加密算法比对称加密算法要复杂的多，处理起来也要慢得多。如果所有的网络数据都用非对称加密算法来加密，那效率会很低。所以在实际中，非对称加密只会用来传递一条信息，那就是用于对称加密的密钥。当用于对称加密的密钥确定了，A 和 B 还是通过对称加密算法进行网络通信。这样，既保证了网络通信的安全性，又不影响效率，A 和 B 也不用见面商量密钥了。所以，在现代，A 和 B 之间要进行安全，省心的网络通信，需要经过以下几个步骤通过 CA 体系交换 public key 通过非对称加密算法，交换用于对称加密的密钥通过对称加密算法，加密正常的网络通信这基本就是 SSL/TLS 的工作过程了。

## 握手流程

1. 用户向 web 服务器发起一个安全连接的请求
2. 服务器返回经过 CA 认证的数字证书，证书里面包含了服务器的 public key
3. 用户拿到数字证书，用自己浏览器内置的 CA 证书解密得到服务器的 public key
4. 用户用服务器的 public key 加密一个用于接下来的对称加密算法的密钥，传给 web 服务器因为只有服务器有 private key 可以解密，所以不用担心中间人拦截这个加密的密钥
5. 服务器拿到这个加密的密钥，解密获取密钥，再使用对称加密算法，和用户完成接下来的网络通信
