Я могу поделиться своим опытом и подходом к переходу с одного 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";
}