我目前有一个服务器,它会自动将所有的HTTP请求redirect到相应的HTTPS站点。 问题是,似乎有些浏览器不接受SSL证书(StartSSL.com)或不支持SNI,因此他们得到证书警告,用户将不会继续在网站上冲浪。
是否有任何机制试图使浏览器使用HTTPS而不是普通的HTTP,当这种方式不起作用时(例如,证书不被接受或者SNI不被支持),它将继续使用HTTP。
目前我使用的Apache 2.4与多个虚拟主机,所有redirectHTTP连接Redirect / https://domain.example/ 。
如果https不起作用,浏览器不应该自行降级到http,因为攻击者需要做的就是使https不可用(例如阻止端口443)。 所以唯一的办法就是通过指示服务器的浏览器来实现,例如发送一个httpredirect。 当然,这应该通过一个安全的连接发送(否则中间人可能会伪造),但不幸的是,安全连接失败的确是你的问题。
总之:不,这是不可能的,而且这样做更好。
顺便说一句,所有的现代浏览器都支持SNI,但不是所有的应用程序(例如Java应用程序等)都可以。 如果您在Web服务器上有多个域,但这些应用只需要一个域,则可以将该域的证书设置为默认域。 否则,您将需要获得(更昂贵的)证书,其中包含所有需要的域作为主题替代名称。
编辑另一个想法:你可以尝试做的是从你身边下载一个图像作为HTTPS,并检查img标签上的onerror处理程序的成功。 也许这不会触发用户可见的警告,而只是加载失败。 如果成功,您知道https访问可能并redirect用户。
除此之外,你必须问自己,为什么你要提供https,如果你也接受http的访问。 要么有数据要保护,要么没有。 只要你提供了对http的回退,攻击者很容易强制http而不是https。
首先应该可以为所有缺乏SNI支持的客户指定一个证书。 这意味着在该IP地址上托pipe的所有域名,您可以至less有一个为没有SNI的客户端工作。
当从httpredirect到https时,您可以执行的操作是两级redirect。 从http到https的第一个redirect使用的域名,你保证可以使用或不使用SNI的支持。 必须包含完整的原始URL,以便从此https站点redirect到之后的正确URL。
根据SNI是否被客户端支持,使用或不使用SNI的域名可以有不同的performance。 这样,您就可以知道客户端支持SNI,然后将其redirect到需要SNI的域。
如何在Apache上configuration这个function会从我身边猜测(因为我从来没有为Apacheconfiguration多个证书)。 我想这样做的方法是创build名称为基础的虚拟主机的所有领域,包括中间域。
然后为没有SNI的客户端创build默认虚拟主机,SNI使用与使用名称相同的证书。 这两个具有相同证书的虚拟主机将根据是否支持SNI向客户端发送不同的redirect。
最后,我将在服务器上启用IPv6。 使用IPv6,您可以获得足够的IP地址,您可以为每个虚拟主机分配一个IP地址。 同一组虚拟主机可以基于IPv4和基于IPv6的IP进行命名,因此您不必以此方式复制任何configuration。
最终结果将是一个设置,只要客户端支持SNI或IPv6,就可以工作。 只有那些不支持的客户端才会有问题,但是您仍然可以检测到这些客户端,并为不同的redirect或错误消息提供服务。
对于不喜欢CA的客户,我唯一的build议就是通过用户代理来识别他们,并对他们进行处理。 确保你有一个链接到https站点,他们可以点击,以防错误包括太多的客户端。
只是一个疯狂的猜测:难道你没有在你的apacheconfigurationSSLCertificateChainFile指令,其中包括你需要StartSSL的sub.class1.server.ca.pem文件?