67

我可以找到有关 SNI 的各种信息(请参阅Wikipedia),但我找不到有关浏览器实际支持的任何统计数据。

我能找到的最好的结果是它应该可以在带有 SP3 的 Windows XP 上运行。

有谁知道 SNI 是否真的可以在实践中使用?

4

8 回答 8

92

我可以分享我的经验和方法,将虚拟主机环境(每台服务器多个域)中的每个 IP 证书切换到所有域一个 IP 的负载平衡环境。

我们查看了我们的分析(每月超过 100 万的独立访问者),主要是希望在线购买汽车零部件的北美男性用户,并发现在 2014 年 3 月 8 日,大约 4% 的用户在 Windows XP 上使用 Internet Explorer(其他是次要的——最坏的情况下,不支持 SNI 会影响总用户的 4.5%)。请记住,我们无法“控制”这些用户,因此我们无法告诉他们切换浏览器。这个百分比也在迅速下降,至少在美国是这样。

我们首先认为非 SNI 客户与支持 SNI 的客户有一些不同的体验是“可以的”。

我们的方法是检测服务器端(使用 UA 字符串)哪个浏览器/操作系统组合不支持 SNI(正如其他人提到的:关于 SNI 支持的维基百科文章)。我们所有的域(约 120 个)都会有一条 A 记录指向一个负载均衡的 IP。我们为一个可以称为 generic-autoparts.com 的域提供了第二个 IP(也是负载平衡的)。

所以设置是[我没有与我使用的任何域相关联,如下例所示]:

mikesautoparts.com --> IP X dansautoparts.com 的域名
服务器记录 --> IP X jensautoparts.com 的域名服务器记录--> IP X
的域名服务器记录
...等

generic-autoparts.com --> IP Y 的名称服务器记录

如果客户点击http://www.dansautoparts.com并支持 SNI,则没有任何反应。他浏览 dansautoparts.com,到结账时,他使用https://www.dansautoparts.com

如果客户点击http://www.dansautoparts.com,我们检测到他不支持 SNI,我们会立即将客户重定向到http://generic-autoparts.com/dansautoparts.com。他在那里购物,并在结账时使用https://generic-autoparts.com/dansautoparts.com

现在,如果客户直接点击https://www.dansautoparts.com(电子邮件中的链接,搜索引擎中的索引页面),那么您就不走运了。他们会得到一个令人讨厌的证书错误。在我们的案例中,我们确保我们的系统发送的所有电子邮件都没有使用 https,并且我们知道搜索引擎没有索引我们的 https 页面。

每种环境都有不同的挑战和潜在的权衡取舍。我们发现这在我们的案例中效果很好,客户会“接受”(或不注意到)被重定向到http://generic-autoparts.com/[ORIGINAL DOMAIN].com 。我们还通过 generic-autoparts.com 确保结账安全。

假设 20% 的非 SNI 用户注意到重定向,看起来很可疑,然后他们离开了。在我们的例子中,这是 0.8 - 0.9 %(基于 2014 年 3 月 8 日的数字)的用户,我们愿意“忍受”这一点。我现在没有这方面的具体数据,但整体销售保持稳定。[编辑 2014 年 3 月 28 日:在我们转换 100% 的客户后,我们没有看到对销售的影响]

实施更新 2014 年 7 月 8 日

事实证明,在服务器上静态检测每个 UA 代理字符串是不可能的。我们实现了以下 JavaScript 来检测浏览器的 SNI 功能。一般的方法是对需要 SNI 的域执行 JSONP 请求(Apache 通过“SSLStrictSNIVHostCheck on”支持这一点)。如果 JSONP 请求因超时而失败,我们会将客户重定向到非 SNI 域。

更复杂的是,我们不想仅仅因为 SNI_TEST_DOMAIN 关闭就重定向每个人。如果 JSONP 请求失败(由于无法直接检测 JSONP 失败而超时),我们会通过执行 HTTP“健康检查”请求来验证服务器是否可用。此外,我们不想在每次页面加载时都运行这个 javascript 代码,因为这会增加一些奇怪的超时和错误重定向许多客户的机会,所以我们在 SNI 检查完成后设置一个会话变量,这样就不会发生再次在客户浏览网站时。

我们知道,由于 JSONP 超时不可靠,我们会收到某些失败的错误检查,但自从实施此操作后,我们没有收到客户的任何投诉。

var redirect='http://REPLACE_WITH_NON_SNI_URL';

var sni_https_timeout, sni_http_timeout;
var https_req = $.ajax({
    url : 'https://SNI_TEST_DOMAIN.com/snitest.php',
    dataType : "jsonp",
}).done(function() {
        window.clearTimeout(sni_https_timeout);
        var request = $.ajax({
        url: "index.php?ua=sni_check_done",
       type: "POST"
    });
})

sni_https_timeout = window.setTimeout(function() {
    var http_req = $.ajax({
        url : 'http://SNI_TEST_DOMAIN/sni_healthcheck.php',
        dataType : "jsonp"
    }).done(function()
        {
            window.clearTimeout(sni_http_timeout);
            window.setTimeout(function()
            {
                window.location = redirect;
            },
        200);
    });

    sni_http_timeout = window.setTimeout(function() { sni_http_fail(); }, 8000);

}, 8000);

function sni_http_fail() {
    var request = $.ajax({
        url: "index.php?ua=sni_check_done",
        type: "POST"
    });
}

snitest.php / sni_healthcheck.php:

<?php
if (array_key_exists('callback', $_GET))
{
    header( 'Content-type: application/javascript' );
    echo "{$_GET['callback']}();\n";
}
于 2014-03-08T17:18:19.963 回答
19

您引用的Wikipedia 文章列出了支持的浏览器和服务器版本。例如,Internet Explorer 7(Vista 或更高版本,而不是 XP)或更高版本以及 Mozilla Firefox 2.0。除非您知道所有访问者都在使用受支持的浏览器,否则您无法使用 SNI(在一个 IP 地址上具有多个证书)而不将它们与您网站的 SSL 部分断开。

于 2011-03-01T14:43:15.447 回答
9

问题是 Windows XP 客户端和 Android < 3.0 客户端。不幸的是,他们仍然是我们许多网站访问者的近 10%。此外,虽然黑莓用户数量较少,但他们是我们的一些付费客户。目前(2015 年 2 月),XP、Blackberry 和 Gingerbread 的组合使我们的大多数网站都无法接受 SNI。我预计这个问题会在一两年内减少。

2016 年 11 月更新(21 个月后):进入一个相当标准的网站,访问量约为 10,000 次/月。2013 年 1 月 ~10% 非 SNI。2014 年 1 月 ~6%,2015 年 1 月 <2%,2016 年 1 月 ~0.5%,2016 年 11 月 ~0.1%(千分之一)。我们在 2015 年 11 月/12 月进行了切换。但是,某些市场可能有更多的此类用户。我在 Google Analytics 中创建了自定义受众,因此很容易看到影响。只需定义操作系统名称,版本开头,对于XP,浏览器是IE。

于 2015-02-19T04:49:31.677 回答
5

Windows XP 上的 Internet Explorer(所有版本;6、7 和 8)不支持 SNI。所有其他的工作。我真的不知道 XP 上有多少用户使用 Internet Explorer,但这是无法使用 SNI 的神奇用户数。

移动支持:

Android default browser on Honeycomb or newer      
Windows Phone 7
MobileSafari in Apple iOS 4.0 or later
于 2012-03-29T21:53:37.930 回答
3

是的

您将无法通过 SNI 支持来自 XP 的 SSL 连接。但是,允许 XP 客户端连接无论如何都不符合某些标准,因此您可能出于其他原因不得不删除这些用户。

它们在 2016 年仅占百分之几,而且还在下降。如果您必须使用 SSL 支持每个用户,那么您将需要动态切换,但如果您只需要绝大多数......当然。

于 2016-06-30T19:28:03.040 回答
2

我回答这个问题很晚,但对于所有可能对这种解决方案感兴趣的读者来说。只需使用服务器端功能检测浏览器和操作系统,并告诉访问者使用“安装和使用安全浏览器进行在线购物,如 Chrome 或 Firefox,并提供下载和安装链接”。

这是确保客户购物安全的最佳方式,它有两个目的,一个是启用 SNI 的 SSL 使用,另一个是确保客户的“购物安全”。因为无论服务器是否使用启用 SNI 的 SSL,XP 上那些过时的浏览器确实不安全。

我们可以冒这个风险,因为在美国,在 XP 上使用旧 IE 版本的用户比例低于 5%,而在其他国家/地区则可以忽略不计或为零。事实上,其他国家的人们已经习惯了开源浏览器。

我自己的经验,我为自己和许多客户托管了许多网站,并且我为所有这些网站使用 SNI 技术而没有专用 IP,我很确定人们已经转向 chrome 或 firefox 在许多国家,几乎所有人在美国,95%。

请原谅我的任何不准确的信息。

于 2014-08-20T13:27:44.677 回答
1

http://caniuse.com/#feat=sni目前表示 97.6% 的浏览器都支持 SNI。

于 2015-11-15T05:42:20.263 回答
0

我认为这有两个方面,UI和检测部分。

用户体验

<!--[if lt IE 7]>
   <div>You're using a browser that has high security risks (SSL, XSS, etc). Please consider upgrading it.</div>
<![endif]-->

很明显,任何使用的人IE6 or below都有很高的机会启用Windows XP并且不支持 SNI。其他欺骗他们的用户代理的人在这里无关紧要。

服务器端

  1. 嗅探用户代理。单元测试完成后会提出正则表达式。
  2. 使用上面的 AJAX 实现。

特别说明

使用 AJAX 解决方案可为您提供 99% 的防弹检测,但不符合一些 Web 开发原则。

  • 渐进式增强- 您向所有用户提供相同的 AJAX 请求。支持 SNI 的用户不应该被打扰。
  • 旧版- 您不能轻易弃用此代码。
  • 如果您在 AJAX 请求中使用 jQuery,则可能会影响您的代码,这取决于 $.ajaxStop() 方法。
于 2014-10-20T15:14:44.083 回答