首先,应该有可能为所有缺少SNI支持的客户端指定一个证书。这意味着在该IP地址上托管的所有域中,您至少可以为没有SNI的客户端使用其中一个域。
从http重定向到https时,您可以做的是两阶段重定向。从http到https的第一个重定向使用域名,您确保可以使用该域名,无论是否支持SNI。必须包含完整的原始URL,以便以后可以从此https网站重定向到正确的URL。
无论客户端是否支持SNI,使用或不使用SNI的域名的行为都可能不同。这样,在将客户端重定向到需要SNI的域之前,您将知道客户端支持SNI。
从我的角度来看,如何在Apache上进行精确配置(由于我从未为Apache配置过多个证书)。我猜想这样做的方法是为包括中间域在内的所有域创建基于名称的虚拟主机。
然后为没有SNI的客户端创建默认的虚拟主机,该主机使用与使用名称的证书相同的证书。这两个具有相同证书的虚拟主机将根据客户端是否支持SNI发送不同的重定向到客户端。
最后,我将在服务器上启用IPv6。使用IPv6,您可以获得足够的IP地址,可以为每个虚拟主机分配一个IP地址。同一组虚拟主机可以是基于IPv4的名称,也可以是基于IPv6的IP,因此您不必以这种方式重复任何配置。
最终结果将是只要客户端支持SNI或IPv6都可以使用的设置。只有不支持这两种方法的客户端才会有问题,但是您仍然可以检测到这些问题,并为服务器提供其他重定向或错误消息。
对于不喜欢CA的客户,我唯一的建议是通过其用户代理识别它们并按照您认为合适的方式处理它们。确保您确实有一个指向https站点的链接,如果您错误地包含了太多的客户端,他们可以单击该站点。