我正在研究是否可以通过 HTTPS 在一台服务器上托管多个域,但对于每个域,我都有不同的证书。
在这种情况下,我需要知道传入连接的域,因此在 SSL 握手的第一部分中,它是否具有我需要为该域发回正确证书的信息?
我正在研究是否可以通过 HTTPS 在一台服务器上托管多个域,但对于每个域,我都有不同的证书。
在这种情况下,我需要知道传入连接的域,因此在 SSL 握手的第一部分中,它是否具有我需要为该域发回正确证书的信息?
可以,只要服务器和客户端支持 Server-Name-Indication(或 SNI)扩展。此扩展允许 HTTPS 的虚拟主机,其中您有多个独立的域和绑定到单个 IP 地址的证书。
现在大多数客户都支持 SNI。如果您有使用 Windows XP、旧版本 Android 或 Java 6 等平台的旧客户端,您可能会遇到问题。
如果没有 SNI,域首先以明文形式出现在 TLS 握手的 Server Hello 中(在 Certificate 字段的 rdnSequence 中)。
使用 SNI,域首先以明文形式出现在 TLS 握手的 Client Hello 中(在 SNI 字段中)。
资料来源:我使用 TLS 启动了 apache2,并在实施 SNI(apache2 中的虚拟主机)之前和之后进行了数据包捕获。
除了 SNI,还有一个获取多域证书的选项。几个证书提供商提供此类证书(不认可任何人,谷歌是你的朋友)。
使用多域证书,您无需在握手开始时知道域名,因为该证书对列出的所有域名都有效。
以下是此类证书的示例: