假设我有一个域的 TLS 证书,但我不确定是否所有可能通过 HTTP 连接的用户代理都会接受它。我能否获得另一个证书,由另一个证书颁发机构签名,并在这种情况下作为后备使用,对用户透明?如果可能,建立安全连接的客户端-服务器通信将如何进行?这个用例在流行的 HTTP 服务器的配置中是否广为人知并受支持?
我知道有类似的问题,但他们询问通过子域(可能)或路径前缀(不可能的 IIUC,因为在协商时服务器只知道权限,而不是完整的请求 URI)来改变使用的证书。
假设我有一个域的 TLS 证书,但我不确定是否所有可能通过 HTTP 连接的用户代理都会接受它。我能否获得另一个证书,由另一个证书颁发机构签名,并在这种情况下作为后备使用,对用户透明?如果可能,建立安全连接的客户端-服务器通信将如何进行?这个用例在流行的 HTTP 服务器的配置中是否广为人知并受支持?
我知道有类似的问题,但他们询问通过子域(可能)或路径前缀(不可能的 IIUC,因为在协商时服务器只知道权限,而不是完整的请求 URI)来改变使用的证书。
一台服务器可以支持多个 TLS 证书。但它只能在与客户端的 TLS 握手中提供单个 TLS 证书。AFAIK 是 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 以上密码的旧客户端执行相同操作
但是一旦服务器选择了证书,就没有回退,客户端要么接受要么拒绝提供的证书。