一个服务器可以提供多个 TLS 证书吗?

一个服务器可以提供多个 TLS 证书吗?

假设我有一个域的 TLS 证书,但我不确定所有可能通过 HTTP 连接的用户代理是否都会接受它。我是否可以获得由另一个证书颁发机构签名的另一个证书,并在这些情况下将其用作后备,对用户透明?如果可能,客户端-服务器通信将如何建立安全连接?这种用例是否众所周知并在流行的 HTTP 服务器配置中得到支持?

我知道有类似的问题,但他们询问通过子域(可能)或路径前缀(不可能 IIUC 因为在协商时服务器只知道权限,而不知道完整的请求 URI)改变使用的证书。

答案1

一个服务器可以提供多个 TLS 证书吗?

服务器可以支持多个 TLS 证书。但只能提供与客户端的 TLS 握手中只有一个 TLS 证书。据我所知,这是 TLS(握手)协议中设置的限制RFC 5246

能力支持当您有多个不同的域名并且它们都指向同一个服务器时,最常使用多个证书。

服务器名称指示 在客户端进行的 TLS 握手中发送服务器的主机名。这样服务器就可以选择最适合该连接的证书。也就是说,www.example.com当客户端表示想要连接时,服务器可以使用该证书www.example.com,而当客户端仅使用 IP 地址、没有主机名或 ClientHello 消息中的不同主机名进行连接时,服务器可以使用不同的(或默认)证书。

除了来自 ClientHello TLS 握手消息的服务器名称之外,还可以配置服务器以使用其他参数来选择不同的证书。

例如,在 TLSv1.2 握手期间,客户端表示首选使用椭圆曲线而不是 RSA ,则可以提供 ECDSA 密钥/证书,而对于不使用椭圆曲线的客户端,则可以提供 RSA 证书。
例如,请参阅https://www.haproxy.com/blog/serving-ecc-and-rsa-certificates-on-same-ip-with-haproxy/和/或https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcertificatefile

例如,你可以对不支持 TLSv1.0 以上密码的旧客户端执行相同操作

但是一旦服务器选择了证书,就没有后备方案了,客户端要么接受要么拒绝提供的证书。

相关内容