用于浏览器使用的请求数据加密的密码

信息安全 加密 tls 网页浏览器 密码选择
2021-09-02 00:40:24

请注意,这不是关于 SSL 通信如何在浏览器(我研究并理解它)和客户端之间发生的,而是关于其他方面的。

使用Digicert 的 SSL 机制解释,我了解了数据在浏览器和服务器之间是如何加密的。以下是我的理解。

  1. 浏览器将向服务器发送请求以获取一些资源。服务器检查请求的协议是否为 HTTPS,如果是,则它将在响应中发送其证书(此证书已由某个 CA(证书颁发机构,如 Digicert)签名)。
  2. 浏览器将通过验证在其有效 CA 池中查找签名机构来检查证书是否有效。
  3. 如果浏览器发现该证书是由有效的 CA 签名的,则它会生成一个会话密钥并使用证书中存在的公钥对其进行加密。
  4. 浏览器会将这个加密的会话密钥发送到服务器,服务器将解密会话密钥。服务器将向浏览器发送回一个确认,该确认将使用会话密钥进行加密。
  5. 上述步骤完成 SSL 握手,然后在浏览器和服务器之间开始安全通信。

问题:
根据我的上述理解:

  1. 浏览器将生成一个会话密钥并使用服务器的公钥对其进行加密。但是浏览器将使用哪种加密算法(或通常称为密码算法)?
    • 如何确定密码选择,浏览器和服务器是否会使用相同的密码/密钥大小进行加密和解密?
  2. SSL 握手完成后,所有通信都将使用对称会话密钥进行加密,但浏览器又将使用哪种加密算法?
  3. 浏览器使用的加密算法是否依赖于从服务器收到的证书?
    • 还是浏览器执行的所有加密都使用相同的密码算法执行?
  4. 如果我错了,请纠正我,算法或密码信息也存在于证书中?该信息如何存储在证书中?
    • 在生成证书时,我需要说明哪种算法、多少位加密、填充等?

基于上面的答案,我将有一个最重要的问题 - 假设我正在向某人提供我的服务器的私钥,以便他可以监控我的服务器的 SSL 流量,然后除了向他提供我需要的所有其他东西的私钥之外小心。我需要告诉他我在服务器上使用的算法或密码吗?

3个回答
  1. 浏览器将生成一个会话密钥并使用服务器的公钥对其进行加密。但是浏览器将使用哪种加密算法(或通常称为密码算法)?
    • 如何确定密码选择,浏览器和服务器是否会使用相同的密码/密钥大小进行加密和解密?

浏览器会将密码套件列表发送到它支持的服务器。 这个答案将详细解释密码套件是什么,但基本上密码套件是用于安全通信的算法列表。密码套件包含:

  • TLS 版本
  • 密钥交换算法
  • 签名算法
  • 对称加密算法
  • 完整性算法

例如: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

浏览器向服务器发送支持的密码套件列表,服务器选择它支持的最安全的密码套件。如果它不支持列表中的任何内容,则连接失败。对称加密算法是会话密钥的用途。在 SSL/TLS 中,密钥是从pre-master secret生成的。

  1. SSL 握手完成后,所有通信都将使用对称会话密钥进行加密,但浏览器又将使用哪种加密算法?

同样,密码套件中的对称算法将用于加密通信。在上面的示例中,它将是 GCM 模式下的 128 位 AES。

  1. 浏览器使用的加密算法是否依赖于从服务器收到的证书?
    • 还是浏览器执行的所有加密都使用相同的密码算法执行?

它绝不依赖于证书。所有加密均由服务器选择的密码套件中的对称加密算法执行。

  1. 如果我错了,请纠正我,算法或密码信息也存在于证书中?该信息如何存储在证书中?
    • 在生成证书时,我需要说明哪种算法、多少位加密、填充等?

用于安全通信的算法和密码不在证书中,而是如上所述在服务器选择的密码套件中。证书仅包含与证书本身有关的信息。其中包括但不限于有效性信息、签名算法、发行者信息等。

基于上面的答案,我将有一个最重要的问题 - 假设我正在向某人提供我的服务器的私钥,以便他可以监控我的服务器的 SSL 流量,然后除了向他提供我需要的所有其他东西的私钥之外小心。我需要告诉他我在服务器上使用的算法或密码吗?

我强烈建议不要为 SSL 流量监控提供服务器的私钥(出于此问题范围之外的原因)。但是,如果您决定共享您的私钥,则另一方不需要任何其他信息。由于算法和密码不包含在证书中。

超级简短的回答:服务器和客户端协商他们支持并随后使用的算法。它在握手期间进行通信。

不是答案(@raz 明白了),但您的“理解”中的一些错误对于 IMO 的评论来说太大了:

浏览器将向服务器发送请求以获取一些资源。服务器检查请求的协议是否为 HTTPS,如果是,则它将在响应中发送其证书(此证书已由某个 CA(证书颁发机构,如 Digicert)签名)。

SSL/TLS 握手发生在浏览器发送请求之前,因此请求(包括 URL)被加密。请参阅如果 SSL 加密 url,那么 https 消息是如何路由的? SSL / TLS (https) 是否隐藏正在访问的 url

浏览器首先检查方案,并且(通常)连接到端口 443 用于 https 而不是 80 用于 http。对于在一个 IP 地址上支持多个“虚拟主机”的现代服务器,浏览器可以并且通常确实 在称为服务器名称指示 (SNI) 的扩展中发送 URL的主机部分,以便服务器可以选择正确的证书用于所需的主机。

浏览器将通过验证在其有效 CA 池中查找签名机构来检查证书是否有效。

正如 Digicert 页面正确所说,浏览器检查证书是否由本地存储中的 CA 签名,并且未过期、未撤销并且 [for the correct host]该页面在一个方面已经过时:现在几乎所有来自公共 CA 的证书(如 Digicert)都使用更灵活的 SubjectAlternativeName 扩展(通常缩写为 SAN)而不是 Subject 字段的 CommonName 元素来指定主机名。效果基本一样。

[如果浏览器正常] 生成会话密钥并使用证书中存在的公钥对其进行加密。
浏览器会将这个加密的会话密钥发送到服务器,服务器将解密会话密钥。[...]

这过于简单化并且已经过时了。原始的“RSA”密钥交换方法确实使用 RSA 加密,但客户端选择和加密的值不是“会话密钥”而是有助于多个会话密钥的预主密钥:请参阅https://crypto.stackexchange .com/questions/1139/what-is-the-purpose-of-four-different-secrets-shared-by-client-and-server-in-ssl

同样在今天,使用Diffie-Hellman的(几种变体)变得越来越普遍, 正如@Neil 所评论的那样,它可以提供前向保密;请参阅SSL/TLS 如何工作?. @raz 答案中的示例密码套件 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 使用由 RSA 验证的 Ephemeral Elliptic-Curve Diffie-Hellman (ECDHE) 密钥交换。这不会使用 RSA 加密和解密 premaster;相反,客户端和服务器独立地选择椭圆曲线子组中的随机元素顺序,并在数学上将它们组合以产生预主控。