Действительно ли SNI используется и поддерживается в браузерах? - PullRequest
66 голосов
/ 01 марта 2011

Я могу найти различную информацию о SNI (см. Википедия ), но я не могу найти статистику о фактической поддержке в браузерах.

Лучшее, что я мог узнать, - этодолжен работать в Windows XP с пакетом обновления 3 (SP3).

Кто-нибудь знает, можно ли использовать SNI на практике?

Ответы [ 8 ]

90 голосов
/ 08 марта 2014

Я могу поделиться своим опытом и подходом к переходу с одного IP-адреса на сертификат в среде виртуального хостинга (несколько доменов на сервер) на среду с балансировкой нагрузки с одним IP-адресом для всех доменов.

Мы посмотрелив нашей аналитике (более 1 миллиона уникальных посетителей в месяц), которая в основном состоит из североамериканских пользователей мужского пола, желающих купить автозапчасти через Интернет, и 8 марта 2014 года выяснилось, что примерно 4% пользователей использовали Windows XP с использованием Internet Explorer (другие былинезначительный - в худшем случае 4,5% от общего числа пользователей будут затронуты при отсутствии поддержки SNI).Имейте в виду, что у нас нет «контроля» над этими пользователями, поэтому мы не можем сказать им, чтобы они переключали браузеры.Этот процент также снижается довольно быстро, по крайней мере, в США.

Сначала мы решили, что для клиентов, не являющихся SNI, «нормально» иметь несколько иной опыт, чем для клиентов, поддерживающих SNI.

Наш подход заключался в том, чтобы определить на стороне сервера (используя строку UA), какая комбинация браузера и операционной системы не поддерживает SNI (как упоминали другие люди: Статья в Википедии о поддержке SNI ).Все наши домены (~ 120) будут иметь запись A, указывающую на один IP с балансировкой нагрузки.У нас был второй IP-адрес (также с балансировкой нагрузки) для домена, который мы можем назвать generic-autoparts.com.

Итак, настройка такова: «Я не связан ни с какими доменами, которые я использую в качестве примеров ниже]:

mikesautoparts.com -> Запись имени сервера IP Xdansautoparts.com -> Запись имени сервера IP Xjensautoparts.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% пользователей, не являющихся SNI, замечают перенаправление, оно кажется подозрительным, и они уходят.В нашем случае это 0,8-0,9% (по данным на 8 марта 2014 года) пользователей, и мы были готовы с этим "жить".У меня нет конкретных данных по этому вопросу сейчас, но общие продажи не изменились.[РЕДАКТИРОВАНИЕ 28.03.2014: Мы не увидели никакого влияния на продажи после того, как переключили 100% наших клиентов]

Обновление реализации 8 июля 2014 года

Оказывается, чтоневозможно статически обнаружить каждую строку агента UA на сервере.Мы реализовали следующий JavaScript-код для определения возможностей SNI браузера.Общий подход состоит в том, чтобы выполнить запрос JSONP к домену, который требует SNI (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";
}
19 голосов
/ 01 марта 2011

В статье Википедии, на которую вы ссылались , перечислены поддерживаемые версии браузера и сервера.Internet Explorer 7 (Vista или выше, не XP) или более поздней версии и Mozilla Firefox 2.0, например.Если вы не знаете, что все ваши посетители используют поддерживаемые браузеры, вы не можете использовать SNI (с несколькими сертификатами на одном IP-адресе), не отключая их от части SSL вашего сайта.

9 голосов
/ 19 февраля 2015

Проблема в клиентах Windows XP и Android <3.0. К сожалению, в совокупности они по-прежнему составляют почти 10% посетителей многих наших сайтов. Кроме того, хотя пользователи Blackberry имеют небольшой объем, они являются одними из наших платящих клиентов. XP, Blackberry и Gingerbread вместе делают SNI неприемлемым для большинства наших сайтов в настоящее время (февраль 2015 г.). Я ожидаю, что эта проблема уменьшится примерно через год или два. </p>

Обновление от ноября 2016 г. (21 месяц спустя): переход на довольно стандартный сайт с ~ 10 000 посещений в месяц. Январь 2013 ~ 10% без SNI. Январь 2014 г. ~ 6%, январь 2015 г. <2%, январь 2016 г. ~ 0,5%, ноябрь 2016 г. ~ 0,1% (1 на 1000). Мы осуществили переход в ноябре / декабре 2015 года. Однако на некоторых рынках таких пользователей может быть больше. Я создал пользовательскую аудиторию в Google Analytics, чтобы было легко увидеть ее влияние. Просто определите по имени ОС, версия начинается с, а для XP браузер IE. </p>

5 голосов
/ 30 марта 2012

Internet Explorer (все версии; 6, 7 и 8) в Windows XP не поддерживают SNI. Все остальные работают. Я действительно не знаю, сколько пользователей в XP используют Internet Explorer, но это волшебное число пользователей, которые не могут использовать SNI.

Мобильная поддержка:

Android default browser on Honeycomb or newer      
Windows Phone 7
MobileSafari in Apple iOS 4.0 or later
3 голосов
/ 30 июня 2016

Да

Вы не сможете поддерживать SSL-соединения из XP с SNI.Однако разрешение подключения клиентов XP не соответствует каким-либо стандартам, так что вам, возможно, придется отказаться от этих пользователей по другим причинам.

В 2016 году они составляют всего несколько процентов и снижаются.Если вы должны поддерживать каждого пользователя с SSL, то вам нужно будет динамически переключаться, но если вам просто нужно подавляющее большинство ... конечно.

2 голосов
/ 20 августа 2014

Я опаздываю с ответом, но для всех читателей, которые могут быть заинтересованы в таком решении. Просто определите браузер и ОС, используя функцию на стороне сервера, и попросите посетителя использовать «Установите и используйте безопасный браузер для покупок в Интернете, таких как Chrome или Firefox, и предоставьте ссылку для загрузки и установки».

Это лучший способ сделать покупки безопасными для вашего покупателя, и это служит двум целям: одно использование SSL с поддержкой SNI и обеспечение безопасности покупок. Потому что эти устаревшие браузеры на XP действительно небезопасны, независимо от того, использует ли сервер SSL с включенным SNI или нет.

Мы можем рискнуть этим, потому что процент пользователей, использующих более старые версии IE на XP, ниже 5% в США и незначителен или равен нулю в других странах. На самом деле люди из других стран привыкли к браузерам с открытым исходным кодом.

По своему опыту, я размещаю много веб-сайтов для себя, а также для многих клиентов, и у меня есть SSL для всех из них, использующих технологию SNI без выделенного IP, и я совершенно уверен, что люди перешли на Chrome или Firefox во многих странах, почти все они и в США 95% из них.

Прости меня за любую неточную информацию.

1 голос
/ 15 ноября 2015

http://caniuse.com/#feat=sni в настоящее время говорит, что SNI поддерживается в 97,6% браузеров.

0 голосов
/ 20 октября 2014

Я думаю, что есть два аспекта: интерфейс и часть обнаружения.

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. Sniff для агента пользователя. Появятся регулярные выражения после завершения модульных тестов.
  2. Используйте реализацию AJAX выше.

Специальное примечание

Использование решения AJAX обеспечивает на 99% пуленепробиваемое обнаружение, но не соответствует паре принципов веб-разработки.

  • Прогрессивное улучшение - вы отправляете одинаковый запрос AJAX всем пользователям. Пользователи, которые поддерживают SNI, не должны беспокоиться.
  • Legacy - вы не можете легко отказаться от этого кода.
  • Если вы используете jQuery с вашими AJAX-запросами, это может повлиять на ваш код в зависимости от метода $ .ajaxStop ().
...