Web服务器如何知道用于SSL解密的密钥对?


18

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

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

那么服务器如何知道解密所需的密钥呢?


我的猜测

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


关于“可能重复”标志:

尽管我同意所链接的问题和我自己的问题的答案都相似,但我必须说,问题是不同的。毫无疑问,是否可能以及如何托管具有独立SSL证书的多个站点。相反,我的问题是针对底层技术方面的。




我同意答案很相似,但是我认为问题很不相同。
paolo 2016年

Answers:


29

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

这通过服务器名称指示(TLS扩展)进行了更改,该名称确实允许客户端在握手过程中指示所需的主机名。此扩展程序已在所有现代OS中使用,但旧的浏览器或服务器不支持此扩展,因此,如果您希望客户端在WinXP上仍使用IE 6,那将会很不幸。


2
如果有人仍然使用XP,则无论如何他们都不值得访问我的网站;)
paolo 2016年

2
以这种方式限制客户(浏览器而不是人员)时需要格外小心。许多很多企业的Windows升级都不尽如人意,某些android手机供应商也是如此,他们通常根本不升级操作系统(或至少不升级)。Windows XP的市场占有率为8%,而4.4之前版本的android的市场份额似乎很大。
coteyr

如果服务器缺少SNI支持,则可以在没有SNI支持的服务器前使用具有SNI支持的代理。
kasperd '16

1
@coteyr其余大多数XP用户在中国。幸运的是,至少在Internet上,其他地方的使用很少。
迈克尔·汉普顿

7

似乎您对TLS / SSL有一些误解。服务器的公共密钥未加密HTTP请求。它使用前次握手中协商的密钥由对称密码加密。

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

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

只是一个小小的注释,为什么我在问SSL的同时就写TLS:TLS是SSL的新版本。所有版本的SSL一般都被认为是不安全的,因此我们现在主要使用TLS(1.0、1.1、1.2)。


“ HTTP请求没有通过服务器的公共密钥加密。它是使用前次握手中协商的密钥通过对称密码加密的。” 不知道,谢谢单挑!但是,我确实知道TLS取代了SSL,但我们坚持使用传统术语“ SSL证书”,因此我在此提及。
paolo

我知道像“ SSL证书”之类的词通常用于TLS。我试图避免它们,但是我不确定您(或其他人)是否知道TLS一词。
v6ak '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.