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

Alj*_*vic 66 ssl cross-browser sni

我可以找到有关SNI的各种信息(参见维基百科),但我找不到任何有关浏览器实际支持的统计信息.

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

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

ron*_*eth 90

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

我们查看了我们的分析(每月超过100万独立访问者),其中大多数是希望在线购买汽车零件的北美男性用户,并且在2014年3月8日发现大约4%的用户使用Internet Explorer在Windows XP上(其他是次要的 - 最坏的情况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(链接到电子邮件,搜索引擎中的索引页面),那你就不走运了.他们会得到一个令人讨厌的证书错误.在我们的例子中,我们确保我们发送的系统发送的所有电子邮件都没有使用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"
    });
}
Run Code Online (Sandbox Code Playgroud)

snitest.php/sni_healthcheck.php:

<?php
if (array_key_exists('callback', $_GET))
{
    header( 'Content-type: application/javascript' );
    echo "{$_GET['callback']}();\n";
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常好的答案.深入,并描述现实生活中的实施. (12认同)

小智 19

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

  • (这是糟糕的用户体验并打破了https安全/信任模式) (10认同)
  • 用户可以说"仍然继续".因此,看到警告是糟糕的用户体验,并说"无论如何"继续是糟糕的安全.但是用户仍然可以访问这些资源.(我没有在很长一段时间内探讨过这一点,但我假设根据我在11年的评论就是这种情况) (6认同)
  • 它不是真正"切断它们" - 它只是对用户的警告. (3认同)
  • 使用不支持SNI的旧浏览器/操作系统已经不安全了!如果浏览器不支持TLS(SNI是TLS的扩展),则无法帮助他们保持安全,因为SSL在安全性方面已经过时. (3认同)

jef*_*ill 9

问题是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.


the*_*hai 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
Run Code Online (Sandbox Code Playgroud)

  • 在建立SSL/TLS连接之前,您无法进行任何浏览器检测. (5认同)
  • @talonx我假设客户端是从您拥有的非ssl页面重定向的,所以在重定向SSL页面上的用户之前(可能用于身份验证)您可以检查他的浏览器不是吗?顺便说一句:谷歌放弃了对IE8的支持! (2认同)