Skip to content

HTTPS 协议的工作原理

1. 客户端发起 HTTPS 请求

  • 当用户在浏览器中输入一个 HTTPS 开头的 URL 并访问网站时,浏览器首先会发起一个 TLS 握手,告诉服务器浏览器想要建立一个加密的连接。
  • 浏览器会向服务器发出请求,包含它所支持的 TLS 版本加密算法(如 AES、RSA)、压缩方法等信息

示例

bash
Client Hello: TLS version, supported ciphers, compression methods

2. 服务器响应,传递证书

  • 服务器接收到浏览器的请求后,会选择一个双方都支持的加密算法(Cipher Suite),并将服务器的 数字证书(包含服务器的公钥)发送给浏览器。这个数字证书通常由受信任的证书颁发机构(CA,Certificate Authority)签发。

服务器传递的内容包括:

  • 服务器证书:包含服务器的公钥以及服务器的身份信息。
  • 服务器支持的加密算法

示例

shell
Server Hello: Chosen cipher, Server Certificate (includes public key)

3. 浏览器验证服务器证书

  • 浏览器接收到服务器的证书后,会对证书进行一系列的验证,包括:
    1. 证书是否由受信任的 CA 颁发:浏览器会查看证书的签发者是否在它的受信任 CA 列表中。
    2. 证书是否有效:检查证书是否在有效期内。
    3. 证书是否匹配当前访问的域名:确认证书上的域名与用户访问的域名一致。
    4. 证书是否被吊销:浏览器通过 OCSP(Online Certificate Status Protocol)或 CRL(Certificate Revocation List)查询证书是否已被吊销。

如果证书通过了所有验证,浏览器就认为服务器是可信的。

4. 生成会话密钥并加密传输

  • 浏览器验证通过后,开始生成一个会话密钥(即对称密钥)。会话密钥用于加密和解密后续通信中的数据

接下来,浏览器会采取以下步骤:

  • 浏览器用服务器的公钥(从服务器证书中获取的)加密这个会话密钥
  • 加密后的会话密钥通过网络发送给服务器

这个过程确保了即使有人截获了加密的会话密钥,也无法解密,因为只有服务器拥有对应的私钥。

示例

shell
Client: [Encrypted session key with server's public key]

5. 服务器解密会话密钥

  • 服务器接收到加密的会话密钥后,使用它自己的 私钥 解密得到浏览器生成的会话密钥

至此,双方共享了一个会话密钥,且这个会话密钥是安全的(因为只有服务器拥有对应的私钥)。

6. 双方使用对称加密进行通信

  • 现在,客户端和服务器之间已经建立了一个安全的加密通道。
  • 后续的所有通信(包括用户提交的请求、服务器返回的内容)都使用 对称加密算法(如 AES、ChaCha20)加密和解密。

对称加密相比于非对称加密(RSA、ECC),计算效率更高,因此用于实际的数据传输。而非对称加密(RSA)则主要用于安全的密钥交换

那么浏览器与服务器如何通过这个会话密钥来加密和解密数据呢?

6.1 加密请求数据

  • 当用户在浏览器中发起一个请求时(如登录、提交表单等),浏览器首先将请求内容准备好,包括请求头、请求体(POST 数据或 URL 参数)等。
  • 然后,浏览器使用 会话密钥 对这些数据进行 加密。这通常使用一个高效的对称加密算法,比如 AES(高级加密标准)。

具体的加密步骤如下:

  1. 浏览器获取要发送的数据,如 HTTP 请求的内容(路径、方法、参数等)。
  2. 使用会话密钥和选定的对称加密算法(如 AES)加密数据,生成一个 密文(即加密后的数据)。
  3. 浏览器将加密后的数据通过 HTTPS 传输通道发送给服务器。

加密后的数据即使被拦截,也无法被读取或篡改,除非拥有正确的会话密钥。

6.2 服务器解密请求数据

  • 服务器接收到浏览器加密的请求后,会使用相同的会话密钥进行解密。因为对称加密使用的是相同的密钥,服务器可以用它来还原加密的请求数据。

具体的解密步骤:

  1. 服务器收到加密的 HTTP 请求数据。
  2. 使用会话密钥和相同的对称解密算法对密文进行解密,得到原始的请求内容。
  3. 服务器根据解密后的请求内容进行相应处理,比如处理用户登录信息、查询数据库等。

6.3 加密响应数据

服务器处理完请求后,需要将响应结果返回给浏览器。响应数据也会经过同样的加密步骤:

  1. 服务器将响应内容(如 HTML 页面、JSON 数据、状态码等)准备好。
  2. 使用会话密钥对响应数据进行加密,生成密文。
  3. 服务器将加密的响应数据通过 HTTPS 传输回给浏览器。

6.4 浏览器解密响应数据

浏览器收到服务器加密的响应后,再次使用会话密钥进行解密,还原成可读的响应内容。然后,浏览器会处理和渲染该内容,比如更新页面、展示用户信息等。

7. 数据完整性校验

  • 除了加密,HTTPS 还通过消息验证码(MAC)或者哈希函数来保证数据的完整性。
  • 每次通信时,都会计算发送数据的哈希值,确保数据在传输过程中未被篡改。接收方可以根据传输过来的哈希值检查数据的完整性。

8. 客户端和服务器的通信

  • 现在,客户端(浏览器)和服务器之间已经建立了一个安全的通信信道。所有的请求和响应(包括 HTML、CSS、JavaScript 等)都会被加密后再发送,确保数据安全。

例如:

  • 用户登录信息、支付信息等敏感数据通过加密通道安全传输。
  • 即使攻击者拦截了这些数据,也无法解密或篡改。

9. 连接终止

  • 当会话结束时(比如关闭浏览器或者超时),客户端和服务器都会通知对方,断开安全连接,释放加密相关的资源(如会话密钥)。

总结 HTTPS 的主要步骤

  1. 客户端发起 HTTPS 请求,告知服务器支持的加密算法等信息。
  2. 服务器响应并传递证书,包括公钥和加密信息。
  3. 浏览器验证服务器证书,确保服务器可信。
  4. 浏览器生成会话密钥,并使用服务器的公钥加密会话密钥,发送给服务器。
  5. 服务器使用私钥解密会话密钥,双方共享会话密钥。
  6. 使用「会话密钥」对称加密进行通信,确保传输中的数据安全和加密。
  7. 数据完整性校验,保证数据未被篡改。
  8. 双方通信通过安全通道进行,敏感信息被加密传输。
  9. 连接终止,释放加密相关资源。

案例分析

场景:用户登录银行网站

  1. 用户输入银行网站的 URL,浏览器通过 HTTPS 发起请求。
  2. 服务器返回包含数字证书的响应,证书中包含银行网站的公钥。
  3. 浏览器验证证书,确保银行网站的身份真实可信。
  4. 浏览器生成一个随机的对称密钥(会话密钥),用银行网站的公钥加密后发送给服务器。
  5. 服务器用私钥解密会话密钥,接下来客户端和服务器就可以通过这个对称密钥加密的安全通道进行通信。
  6. 用户输入登录信息,数据通过对称加密的方式被传输到服务器。
  7. 服务器返回加密后的响应,用户登录成功。

在这个过程中,用户的登录信息因为被加密,不会被攻击者截获,保证了通信的机密性和安全性。

上次更新: 2023-11-17