在浏览器中实际使用和支持SNI吗?

时间:2011-03-01 12:36:16

标签: ssl cross-browser sni

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

我能找到的最好的是它应该适用于带有SP3的Windows XP。

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

8 个答案:

答案 0 :(得分:90)

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

我们查看了我们的分析(每月超过100万独立访问者),其中大多数是希望在线购买汽车零件的北美男性用户,并且在2014年3月8日发现大约4%的用户使用Windows XP Internet Explorer(其他人是次要的 - 最糟糕的情况,4.5%的用户会受到不支持SNI的影响)。请记住,我们对这些用户没有“控制权”,因此我们无法告诉他们切换浏览器。这个比例也在相当快地下降,至少在美国是这样。

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

我们的方法是检测服务器端(使用UA字符串)哪个浏览器/操作系统组合不支持SNI(正如其他人提到的那样:Wikipedia article on SNI support)。我们所有的域(~120)都有一个指向单个负载均衡IP的A记录。对于我们可以称为generic-autoparts.com的域,我们有第二个IP(也是负载平衡的)。

所以设置是[我没有与我在下面使用的任何域名相关联]:

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

generic-autoparts.com - >知识产权的名称服务器记录

如果客户点击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%的nonSNI用户注意到重定向,看起来很可疑,他们就离开了。在我们的案例中,这是用户的0.8-0.9%(基于2014年3月8日的数字),我们愿意“活着”。我目前没有具体的数据,但整体销售保持稳定。 [2014年3月28日编辑:在我们100%转换客户后,我们认为销售没有影响]

2014年7月8日实施更新

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

为了使问题更加复杂,我们不希望仅因为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";
}

答案 1 :(得分:19)

Wikipedia article you referenced列出了支持的浏览器和服务器版本。例如,Internet Explorer 7(Vista或更高版本,而不是XP)或更高版本以及Mozilla Firefox 2.0。除非您知道所有访问者都使用支持的浏览器,否则您无法使用SNI(在一个IP地址上使用多个证书),而无需将其从网站的SSL部分中删除。

答案 2 :(得分:9)

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

2016年11月更新(21个月后):在相当标准的网站上进行,每次访问量约为10,000次。 2013年1月〜非SNI 10%。 2014年1月〜6%,2015年1月&lt; 2%,2016年1月〜0。5%,2016年11月~0.1%(1/1000)。我们在2015年11月/ 12月进行了转换。但是,某些市场可能拥有更多这些用户。我在Google Analytics中创建了自定义受众群体,因此很容易看到其影响。只需按操作系统名称定义,版本开头,对于XP,浏览器是IE。

答案 3 :(得分: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

答案 4 :(得分:3)

您将无法通过SNI支持来自XP的SSL连接。但是,允许XP客户端连接并不符合某些标准,因此您可能因其他原因而不得不放弃这些用户。

他们在2016年仅下降了几个百分点。如果您必须使用SSL支持每个用户,那么您将需要动态切换,但如果您只需要绝大多数......确定。

答案 5 :(得分:2)

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

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

我们可能会冒这个风险,因为在美国使用旧版IE的用户百分比在美国低于5%,在其他国家/地区可忽略不计或为零。事实上,其他国家的人们习惯使用开源浏览器。

我自己的经验,我为自己和许多客户托管了许多网站,我使用没有专用IP的SNI技术为所有人提供SSL,我很确定在许多国家/地区已经转向使用chrome或firefox所有这些和在美国,其中95%。

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

<强> UX

<!--[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实现。
  3. 特别说明

    使用AJAX解决方案可以获得99%的防弹检测,但不符合一些网络开发原则。

    • 渐进式增强 - 您向所有用户提供相同的AJAX请求。支持SNI的用户不应该受到打扰。
    • Legacy - 您不能轻易地弃用此代码。
    • 如果您在AJAX请求中使用jQuery,则可能会影响您的代码,具体取决于$ .ajaxStop()方法。