我可以找到有关SNI的各种信息(请参阅Wikipedia),但是我找不到关于浏览器中实际支持的任何统计信息。
我能找到的最好的办法是,它应在带有SP3的Windows XP上运行。
有人知道SNI是否可以在实践中实际使用吗?
我可以找到有关SNI的各种信息(请参阅Wikipedia),但是我找不到关于浏览器中实际支持的任何统计信息。
我能找到的最好的办法是,它应在带有SP3的Windows XP上运行。
有人知道SNI是否可以在实践中实际使用吗?
Answers:
我可以分享我的经验和方法,以从虚拟主机环境中的每个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";
}
您引用的Wikipedia文章列出了支持的浏览器和服务器版本。例如,Internet Explorer 7(Vista或更高版本,而不是XP)或更高版本以及Mozilla Firefox 2.0。除非您知道所有访问者都在使用受支持的浏览器,否则您将无法使用SNI(在一个IP地址上具有多个证书)而不将其从站点的SSL部分中切断。
问题是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。
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
我回答这个问题很晚,但是对于所有可能对这种解决方案感兴趣的读者来说。只需使用服务器端功能检测浏览器和操作系统,并告诉访问者使用“安装并使用安全浏览器进行在线购物(例如Chrome或Firefox),并提供下载和安装的链接”。
这是使客户购物安全的最佳方法,它有两个作用,一个是启用SNI的SSL使用,另一个是确保客户的“购物安全”。因为XP上那些过时的浏览器实际上并不安全,无论服务器是否使用启用SNI的SSL。
我们可能会冒险,因为在XP上使用较旧IE版本的用户比例在美国低于5%,而在其他国家则可忽略不计或为零。实际上,在其他国家/地区的人们已经习惯了开源浏览器。
以我自己的经验,我为自己和许多客户托管了许多网站,并且使用不带专用IP的SNI技术为所有这些网站提供SSL,并且我可以肯定,在许多国家/地区,人们都转向了chrome或firefox在美国,其中95%。
请原谅我任何不正确的信息。
http://caniuse.com/#feat=sni当前表示97.6%的浏览器都支持SNI。
我认为这有两个方面,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。欺骗用户代理的其他人在这里无关紧要。
服务器端
特别说明
使用AJAX解决方案可为您提供99%的防弹检测能力,但不符合一些Web开发原则。