it-swarm.asia

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

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

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

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

66
Aljosa Mohorovic

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

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

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

我们的方法是检测服务器端(使用UA字符串)哪个浏览器/操作系统组合不支持SNI(正如其他人提到的那样: 关于SNI支持的维基百科文章 )。我们所有的域(~120)都有一个指向单个负载均衡IP的A记录。对于我们可以称为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 DIRECTLY(链接电子邮件,搜索引擎中的索引页面),那你就不走运了。他们会得到一个令人讨厌的证书错误。在我们的例子中,我们确保我们发送的系统发送的所有电子邮件都没有使用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";
}
90
ronneseth

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

19
Robert

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

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

9
jeffmcneill

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
5
themihai

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

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

3
DigitalRoss

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

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

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

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

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

2
LuckyBabu

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

1
Bryan Legend

我认为这有两个方面,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实现。

特别说明

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

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