Web 服务器如何知道使用哪个密钥对进行 SSL 解密?

pao*_*olo 18 ssl https web-server

我的理解是,当 Apache 收到对它正在侦听的 TCP 端口之一(例如 80、443)的请求时,它将通过查看 HTTP 标头来决定正在请求哪个主机Host。然后服务器将知道它应该将请求重定向到哪个虚拟主机。

但是它对基于 SSL/TLS 的 HTTP 是如何工作的呢?由于整个 HTTP 请求都被加密(至少我相信我在某处读到过),因此只有在服务器解密数据后才能读取标头信息。但是为了解密,它需要知道要使用哪个密钥对,因为您可以在 Web 服务器上安装多个 SSL 证书。

那么服务器如何知道解密需要哪个密钥呢?


我的猜测

我可以想象 TLS 握手提供了必要的信息。


关于“可能重复”标志:

虽然我同意链接问题的答案和我自己的答案相似,但我必须说问题是不同的。是否或如何使用独立的 SSL 证书托管多个站点是毫无疑问的。相反,我的问题涉及潜在的技术方面。

Sve*_*ven 29

最初,Web 服务器不知道。这就是您需要为要托管在服务器上的每个 SSL 虚拟主机的单独 IP 地址的原因。这样,服务器就知道当 IP X 上的连接进来时,他需要使用相关虚拟主机的配置(包括证书)。

这随着Server Name Indication发生了变化,这是一个 TLS 扩展,它确实允许客户端在握手过程中指示所需的主机名。这个扩展在所有现代操作系统中都有使用,但旧的浏览器或服务器不支持它,所以如果你希望客户端仍然在 WinXP 上使用 IE 6,那你就不走运了。

  • 如果有人仍在使用 XP,他们无论如何都不应该访问我的网站;) (2认同)
  • 以这种方式限制客户(浏览器而不是人)时需要非常小心。许多很多企业都没有很好地升级Windows,一些Android手机供应商也是如此,他们通常根本不升级他们的操作系统(或至少不升级)。Windows XP 为 8%,而 4.4 之前的 android 市场份额似乎很大。 (2认同)

v6a*_*6ak 7

您似乎对 TLS/SSL 有一些误解。HTTP 请求没有被服务器的公钥加密。它通过对称密码使用先前握手中协商的密钥进行加密。

TLS 握手的简要描述:服务器和客户端协商一些密码套件、对称密钥和一些其他细节。为了防止MITM,服务器通常将其证书(链)发送给客户端并使用证书中的密钥来验证握手。(还有一些其他变体,例如客户端身份验证或 TLS-PSK,但它们很少与 HTTP 一起使用。)客户端可以验证证书(通常的方式)或忽略它。

虽然在一个 IP 上使用多个 TLS 证书时 SNI 很重要,但对于服务器能够解密请求来说并不是必需的。如果没有 SNI,服务器不知道应该发送哪个证书链,因此服务器通常会选择一个(例如第一个 vhost),这当然可能是错误的。如果服务器选择了错误的证书链,客户端应该拒绝它(因此它不会继续发送 HTTP 请求)。但是,如果客户端忽略证书(或者如果无效证书被标记为此站点受信任),它可以成功继续。由于用于加密的对称密钥不依赖于证书(TLS 设计为也可以在没有证书的情况下工作),因此服务器可以对其进行解密。

稍微说明一下为什么我要写 TLS,而您问的是 SSL:TLS 是 SSL 的新版本。所有版本的 SSL 都被认为是不安全的,所以我们现在主要使用 TLS(1.0、1.1、1.2)。