https的加密过程

147 阅读8分钟

综合看了好几篇关于https的加密过程的文章,但是我觉得各自都有点没有解释到位的地方,所以这篇文章算是一个总结。

1. https (http + ssl/tls)

首先要明确的是https比http多的s是什么。s是安全的意思(secure)。这个安全是通过ssl/tls协商http的加密方式来保障的。

2.ssl/tls是如何加密来保证安全的

2.1 加密方式

对称加密和非对称加密是两种主要的加密方法,它们在加密和解密过程中使用的密钥不同。

对称加密:对称加密是指加密和解密使用同一把密钥的加密方法。这种方法的优点是加密和解密的速度都很快,适合于大量数据的加密。但是,密钥的分发和管理是一个问题,因为如果密钥在传输过程中被拦截,那么加密的信息就可能被破解。常见的对称加密算法有AES、DES、3DES等。

非对称加密:非对称加密是指加密和解密使用不同的密钥,通常被称为公钥和私钥。 公钥是公开的,任何人都可以使用公钥来加密信息私钥是保密的,只有私钥的持有者才能解密信息。这种方法的优点是可以安全地分发公钥,即使公钥被其他人获取,也无法解密信息。但是,非对称加密的速度比对称加密慢,通常只用于加密小量数据或加密对称加密的密钥。常见的非对称加密算法有RSA、ECC、DSA等。 非对称加密相比于对称加密我们很难思考它是如何实现的,非对称加密背后蕴含的数学思想很妙。此处我们不对展开深入讨论。

2.1.1 对称加密好处和问题

好处:加密和解密的速度都很快,适合于大量数据的加密。 缺点:如果用对称加密,聊天的双方都得需要知道密钥。那么在正式聊天之前很需要将密钥发送给对方。所以密钥也会泄露在互联网上,如果有心之人拿到密钥了,对密文解密了,这跟明文聊天没什么区别了。

2.1.2 非对称加密的好处和问题

好处:双方都通过非对称加密的,聊天之前也需各自把公钥送到对方手上,同样的公钥被泄漏了。虽然别人(非聊天的双方)拿到了公钥,但是他并不能解密。现在我们的信息安全有保障了。 缺点:1. 非对称加密的速度比对称加密慢,通常只用于加密小量数据或加密对称加密的密钥。2. 非对称加密技术很可靠,但是它不能防止我们的身份被假冒。

假设一种情况。A和B聊天中突然出现了一个中间人,这个中间人他通过一下技术手段拦截了A和B的通信。C假冒B,获得A的公钥;C假冒A获得B的公钥。C还有一对自己的迷钥对,把公钥分发给了A和B。那么,A到手的公钥以为是B的,实际上是C的;B到手的公钥以为是A的,实际上也是C的。A拿着C的公钥加密,C拦截了,用自己的私钥解密;B拿着C的公钥加密,C拦截了信息,用自己的私钥解密。C还可以将解密出来的信息篡改了之后在用A和B的公钥加密返回给他们。由此看来,A和B之间的信息对于C来说都是透明的,而且是可篡改的。

graph TD
A -->|发送A的public-key| C
A -->|用C的公钥加密信息| C
C -->|发送C的public-key| A
C -->|C可篡改B发送给A的信息后, 再用A的公钥加密传给A| A
B -->|发送B的public-key| C
B -->|用C的公钥加密信息|C
C -->|发送C的public-key| B
C -->|C可篡改A发送给B的信息后, 再用B的公钥加密传给B| B
2.2 tls安装证书

服务器的证书来自于证书颁发机构(Certificate Authority,简称CA)。CA是一个发行数字证书的实体,这些数字证书用于在网络中验证实体(如Web服务器)的身份。

以下是获取服务器证书的一般步骤:

  1. 生成密钥对:首先,服务器管理员需要在服务器上生成一个公钥和私钥对。
  2. 创建证书签名请求(CSR) :然后,服务器管理员会使用公钥和服务器的一些身份信息(如域名、组织名称等)来创建一个证书签名请求(Certificate Signing Request,简称CSR)。
  3. 提交CSR给CA:服务器管理员将CSR提交给CA。CA会验证服务器的身份信息。
  4. CA签发证书:一旦验证通过,CA会使用其私钥对CSR进行签名,生成一个数字证书。这个数字证书包含了服务器的公钥和身份信息,以及CA的签名。
  5. 安装证书:服务器管理员将从CA接收到的数字证书安装到服务器上。当客户端连接到服务器时,服务器会提供这个证书,以证明其身份。

请注意,CA需要被客户端(如浏览器)信任,才能有效地验证服务器的身份。大多数操作系统和浏览器都内置了一组受信任的CA列表。

2.3 TLS握手过程

TLS(传输层安全协议)握手过程是建立TLS连接的关键步骤,它确保了数据传输的安全性和完整性。TLS握手涉及客户端和服务器之间的多个步骤,主要目的是协商加密算法、验证双方身份、生成共享密钥等。以下是TLS握手的基本步骤:

  1. 客户端Hello:握手开始时,客户端发送一个“Client Hello”消息给服务器。这个消息包含了客户端支持的TLS版本、加密套件列表、一个客户端生成的随机数(Client Random),以及可能的其他会话特定信息。

  2. 服务器Hello:服务器收到“Client Hello”后,选择一个客户端也支持的TLS版本和加密套件,并发送一个“Server Hello”消息给客户端。这个消息包含服务器选择的TLS版本、加密套件、一个服务器生成的随机数(Server Random),以及服务器的会话ID。

  3. 服务器证书:服务器发送其证书给客户端,证书中包含了服务器的公钥。对于需要服务器身份验证的握手,这一步是必需的。

  4. 服务器密钥交换:服务器可能会发送一个“Server Key Exchange”消息,包含了用于密钥交换的公开信息(Server Params ),具体取决于所选加密套件。

  5. 服务器Hello完成:服务器发送“Server Hello Done”消息,表示服务器端的Hello消息部分结束。

    目前为止,客户端和服务端之间通过明文共享了:Client Random,Server Random,Server Params,而且客户端也拿到了服务端的公钥证书。接下来客户端会校验公钥证书的有效性,并使用公钥证书解密私钥签名过的Server Params

  6. 客户端密钥交换:客户端发送用以实现ECDHE算法的另一个参数(Client Params),客户端根据所选加密套件及其需要的参数(Server Param、Client Params)生成预主密钥(pre-master secret),并使用服务器的公钥加密,发送给服务器。

    客户端、服务器都可以使用ECDHE算法,根据Server Params、Client Params计算出一个新的随机密钥串:Pre-master secret,然后结合Client Random、Server Random、Pre-master secret生成一个主密钥。利用该主密钥可以衍生出其他密钥:客户端发送用的会话密钥、服务器发送用的会话密钥等。

  7. 客户端Hello完成:客户端继续发送一个“Change Cipher Spec”消息,告诉服务器接下来的消息将使用协商的密钥和算法进行加密。客户端还会发送一个“Finished”消息,该消息包含之前握手消息的加密验证。

  8. 服务器Hello完成:服务器收到客户端的“Change Cipher Spec”和“Finished”消息后,也会发送一个“Change Cipher Spec”消息,并发送一个加密的“Finished”消息给客户端。

  9. 握手完成:当客户端和服务器都收到对方的“Finished”消息后,TLS握手完成。此时,双方已经建立了一个安全的加密连接,可以开始安全地传输数据。

整个TLS握手过程涉及到密钥交换、身份验证和协议参数协商等多个环节,确保了通信双方可以建立一个安全的、加密的通信通道。

注意

由于本人并未深入研究过https协议内容,且此文内容多数由ai生成,文章的正确性仅供参考,希望有大佬review,并指正。