将 HTTP 连接升级到 SSL/TLS

将 HTTP 连接升级到 SSL/TLS

我目前有一个服务器,它会自动将所有 HTTP 请求重定向到等效的 HTTPS 站点。问题是,似乎有些浏览器不接受 SSL 证书 (StartSSL.com) 或不支持 SNI,因此它们会收到证书警告,用户不会继续浏览该网站。

是否存在任何机制尝试让浏览器使用 HTTPS 而不是纯 HTTP,并且当它不起作用时(例如证书不被接受或不支持 SNI)它将继续使用 HTTP。

目前我正在使用 Apache 2.4 和多个虚拟主机,它们都使用 重定向 HTTP 连接Redirect / https://domain.example/

答案1

如果 https 不起作用,浏览器绝不应该自动降级为 http,因为攻击者只需使 https 不可用(例如阻止端口 443)。因此,唯一可以做到这一点的方法是从服务器指示浏览器这样做,例如通过发送 http 重定向。当然,这应该通过安全连接发送(否则中间人可以伪造它),但不幸的是,安全连接失败正是您的问题。

总之:不,这是不可能的,而且这样更好。

顺便说一句,所有现代浏览器都支持 SNI,但并非所有应用程序(例如 Java 应用程序等)都支持。如果您的 Web 服务器上有多个域,但这些应用程序只需要一个域,则可以将此域的证书设置为默认证书。否则,您需要获取一个(更昂贵的)证书,其中包含所有需要的域作为主题备用名称。

用另一个想法进行编辑:您可以尝试从您这边以 https 下载图像,并使用 img-tag 上的 onerror 处理程序检查是否成功。也许这不会触发用户可见的警告,而只是加载失败。如果成功,您就知道可以进行 https 访问并重定向用户。

除此之外,你还得问问自己,既然你也接受使用 http 的访问,为什么还要提供 https。要么有数据应该受到保护,要么没有。只要你提供回退到 http 的选项,攻击者就很容易强制使用 http 而不是 https。

答案2

首先,应该可以指定一个证书供所有不支持 SNI 的客户端使用。这意味着,在该 IP 地址上托管的所有域名中,至少有一个可以为不支持 SNI 的客户端使用。

然后,从 http 重定向到 https 时,您可以执行两阶段重定向。从 http 到 https 的第一次重定向使用域名,确保无论有没有 SNI 支持,该域名都可以正常工作。必须包含完整的原始 URL,以便您随后可以从此 https 站点重定向到正确的站点。

域名是否支持 SNI 取决于客户端是否支持 SNI。这样,在将客户端重定向到需要 SNI 的域之前,您就会知道客户端是否支持 SNI。

至于如何在 Apache 上进行具体配置,我个人还是有点猜测的(因为我从来没有为 Apache 配置过多个证书)。我猜想这样做的方法是针对所有域(包括中间域)创建基于名称的虚拟主机。

然后为没有 SNI 的客户端创建一个默认虚拟主机,该虚拟主机使用与使用该名称的虚拟主机相同的证书。这两个具有相同证书的虚拟主机将根据客户端是否支持 SNI 向其发送不同的重定向。

最后,我将在服务器上启用 IPv6。使用 IPv6,您将获得足够的 IP 地址,可以为每个虚拟主机分配一个。同一组虚拟主机可以基于 IPv4 命名,而 IP 则基于 IPv6,因此您无需通过这种方式重复任何配置。

最终结果是,只要客户端支持 SNI 或 IPv6,设置就会起作用。只有不支持这两种协议的客户端才会出现问题,但您仍然可以检测到这些客户端,并向服务器发送不同的重定向或错误消息。

对于不喜欢 CA 的客户端,我唯一的建议是通过其用户代理识别它们,并以您认为合适的方式处理它们。确保您确实有一个指向 https 站点的链接,以防您错误地包含了太多客户端,他们可以点击该链接。

答案3

只是猜测:难道你没有SSL证书链文件您的 apache 配置中的指令是否包含 StartSSL 所需的 sub.class1.server.ca.pem 文件?

相关内容