浏览器是否实际使用和支持SNI?


67

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

我能找到的最好的办法是,它应在带有SP3的Windows XP上运行。

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



1
谢谢尼克,我只是想快速回答,对阅读文章不感兴趣。有时,简短答案是最好的答案。Windows XP的IE8上不支持TL; DR(<全球流量的0.7%)-对我来说足够好!
Scott Jungwirth

Answers:


91

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

我们查看了Google Analytics(分析)(每月有超过100万唯一身份访问者),其中大多数是希望在线购买汽车零部件的北美男性用户,并于2014年3月8日发现大约4%的用户使用的是Internet Explorer Windows XP(其他则是次要的-最坏的情况是不支持SNI将影响总用户的4.5%)。请记住,我们对这些用户没有“控制权”,因此我们不能告诉他们切换浏览器。至少在美国,这一百分比也正在迅速下降。

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

我们的方法是检测服务器端(使用UA字符串),该浏览器/操作系统组合不支持SNI(正如其他人所提到的:有关SNI支持的Wikipedia文章)。我们所有的域(约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%的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";
}

13
这是一个很好的答案。深入介绍实际实现。
MEMark 2014年

1
非常好的回应。您是否有有关SNI支持百分比的数字更新?(一年后):)
kheraud

我想您必须使用没有敏感Cookie或数据的域作为SNI_TEST_DOMAIN,以防止JSON劫持或CSRF或XSS?
Janus Troelsen

Janus-是的,您是正确的,没有与SNI_TEST_DOMAIN相关的cookie或会话存储。
ronneseth

@iwalktheline:受SNI影响的IE8已降至2.3%以下。重申一下,我们的流量的85%来自北美。
ronneseth

19

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


3
这并不是真正的“切断”功能-只是对用户的警告。
约翰·巴希尔

10
(这是糟糕的UX,并破坏了https安全/信任模型)
John Bachir

@JohnBachir您能否继续说明为什么认为它破坏了https安全/信任模型。如果服务器无法确定尝试与之联系的浏览器的站点,则拒绝连接-可以确保安全。我同意这是糟糕的UX,但我看不到安全性问题-我错过了什么吗?
彼得·巴格纳

6
用户可以说“仍然继续”。因此,看到警告是不好的UX,说“仍然继续”是不好的安全性。但是用户仍然可以访问那些资源。(我已经很长时间没有对此进行探讨了,但基于我在'11的评论,我认为是这种情况)
John Bachir 2013年

3
使用不支持SNI的旧浏览器/操作系统已经不安全!如果浏览器不支持TLS(SNI是TLS的扩展),则您不能帮助他们保持安全,因为SSL在安全性方面已经过时。
DUzun 2014年

9

问题是Windows XP客户端和Android <3.0客户端。不幸的是,他们仍然是我们许多网站的近10%的访问者。此外,尽管Blackberry用户数量很少,但他们是我们的一些付费客户。XP,Blackberry和Gingerbread的结合使SNI目前在我们的大多数网站上都不可接受(2015年2月)。我希望这个问题在大约一两年内会消失。

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。


1
感谢您在您的网站上对此进行研究。您能发布这些数字的最新消息吗?目前还剩下什么百分比?非常感谢!
2016年

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

1
我认为我们都认为现代版本可以正常工作。问题是找出有多少个不符合这些条件。Windows XP越来越老,但仍然存在。肯定有很多Android 2.x手机不算老。很多用户不会更换手机以获取最新的小工具(他们也可能会与运营商签订2年的合同)。不幸的是,SNI尚未为这部分市场做好准备。问题更多是关于统计数据。你有什么?
布鲁诺

我认为统计数据取决于您的用户个人资料(例如,您的客户是否拥有XP计算机,或者您是否关心XP用户,因此我怀疑SO是否会关心IE7)。唯一的解决方案是进行浏览器/操作系统检测,并将浏览器/操作系统不兼容的浏览器重定向到启用了传统SSL的页面,而大多数将使用默认的启用SNI的页面。我想您需要SNI,因为它更便宜/支持云功能,所以我认为浏览器检测是一个很好的权衡。
themihai 2012年

5
建立SSL / TLS连接之前,您无法进行任何浏览器检测。
布鲁诺2012年

我想您将用户重定向到SSL页面...至少在我的情况下,我使用SSL进行身份验证,因此在重定向用户(基于他的身份验证cookie)之前,我先检查浏览器/操作系统。
themihai 2012年

2
@talonx我假设客户端是从您拥有的非SSL页面重定向的,因此在重定向SSL页面上的用户(也许用于身份验证)之前,您可以检查其浏览器是否不是?顺便说一句:谷歌放弃了对IE8的支持!
themihai 2012年

3

您将无法通过XP与SNI支持SSL连接。但是,允许XP客户端连接始终不符合某些标准,因此出于其他原因,您可能必须丢弃这些用户。

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


2

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

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

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

以我自己的经验,我为自己和许多客户托管了许多网站,并且使用不带专用IP的SNI技术为所有这些网站提供SSL,并且我可以肯定,在许多国家/地区,人们都转向了chrome或firefox在美国,其中95%。

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


1
基于用户代理进行检测并非总是可行。当浏览器不支持SNI时,它将不会发送正确的名称,不会获得正确的证书作为回报,不会验证该证书,因此甚至无法建立连接,因此不会占用HTTP流量地点,因此不会发送用户代理。
2014年

如果整个网站都启用了SSL,那将是正确的,但通常情况并非如此,只有登录,结帐等安全页面才启用SSL,但是是的,这不会发生或可能发生,我不知道如何处理。
2014年

1

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


浏览器不同于网站的访问者,网站的访问者可能会根据受众特征而倾斜。我正在使用的网站现在不到0.1%(千分之1),因此支持99.9%的SNI。(这是一年后的2016年11月)。
jeffmcneill '16

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()方法。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.