У меня есть Apache 2.2 с mod_ssl и несколько сайтов в HTTPS на одном IP / порту с VirtualHosting, поэтому клиент должен поддерживать SNI для подключения к этим виртуальным хостам.
Я хотел бы настроить свой сервер следующим образом:
Когда пользователь вводит www.dummysite.com и его браузер поддерживает SNI (указание имени сервера), любой HTTP-запрос перенаправляется туда, https://
куда отправляется заголовок HSTS. Но если браузер не поддерживает SNI, то запрос обслуживается по HTTP.
Вышеупомянутое правило, сформулированное как есть, на самом деле является запасным правилом для тех людей, которые все еще используют старые браузеры, поскольку у Mozilla и Chrome такой проблемы нет, просто чтобы не оставлять этих пользователей за пределами сайта.
Я хотел бы сделать это перенаправление на уровне конфигурации Apache, возможно, с фильтром на пользовательский агент. Я не хотел бы трогать запущенные приложения, кроме как убедиться, что нет прямых ссылок http: // (в противном случае они означают предупреждение безопасности)
[Edit] (при редактировании вопроса , который я забыл на вопрос): что список SNI с поддержкой пользовательских агентов для перенаправления?
источник
Мое решение таково:
Если старый браузер без SNI пытается получить доступ к https://www.example.com/ *, он сначала выдаст ошибку в браузере, чего нельзя избежать, так как до тех пор, пока apache не ответит на браузер не SNI, который он не знает какой сайт он запрашивает. Затем он перенаправляет на страницу, сообщающую пользователю, что его браузер слишком стар (до тех пор, пока пользователь нажимает на веб-сайт).
А для пользователей с новыми браузерами у меня есть
Это исключает большинство старых браузеров, в том числе такие, как MSIE 5-8 в Vista (9+ - это только Vista / 7, поэтому поддерживает SNI). Это не 100% (symbian игнорируется и т. Д.), Но должно работать для большинства. Меньшинство все еще может принять ошибку сертификата.
источник
Насколько я знаю, на самом деле не очень хороший способ сделать это - вы можете использовать правило mod_rewrite или аналогичное условно на основе
User-agent
заголовка, но оно должно быть на виртуальном хосте без SSL: если браузер этого не делает поддерживает SNI и переходит на защищенный (https://
) сайт, который получит поведение Apache старой школы: «Вот первый SSL-сертификат, который я связал с этим IP-адресом - надеюсь, это то, что вы хотели!» - Если это не тот сертификат, который ожидал браузер, вы получите сообщение об ошибке несоответствия имени хоста.По сути, это означает, что люди должны перейти на промежуточную страницу без SSL, которая будет перенаправлять их - возможно, предоставляя любые данные, которые они отправляют, в своем запросе. Это может или не может быть нарушителем соглашения (вы говорите, что в любом случае отправите их на сайт без SSL, если они не поддерживают SNI, поэтому я предполагаю, что вас не слишком заботит безопасность. Если бы я был При проектировании системы, которая нуждается в SSL в качестве уровня шифрования или аутентификации, я бы немного настаивал на этом ...)
Однако ничто из этого не мешает кому-либо создавать закладки для защищенного сайта - и если они используют службу общих закладок или восстанавливают свои закладки на компьютере, где веб-браузер не поддерживает SNI, они возвращаются в дело «Возможные ошибки SSL». ,
источник
Я хотел бы решить это одним из трех способов:
RewriteRule
основанный наUser-Agent
заголовках.<SCRIPT>
теге не по умолчанию VHost; если загрузка успешна, это немного JS, который перезагружает всю страницу под HTTPS.Из них мне лично больше всего нравится № 2, но это включает в себя изменение кода вашего сайта.
источник
Просто для тех, кто в этом нуждается.
Если у вас есть несколько хостов и вы хотите, чтобы все они были с поддержкой SSL в VirtualHosting (и вы купили сертификат для каждого), попробуйте новый
mod_djechelon_ssl
Использование:
источник
Как я писал здесь , вы можете проверить только поддержку SNI, прежде чем потребовать ее. Таким образом, вы не можете принудительно заставить пользователей использовать SNI HTTPS, а затем откатиться, если они его не поддерживают, потому что они получат такую ошибку (из Chrome в Windows XP) без возможности продолжить.
Поэтому (к сожалению) пользователь должен фактически начать через незащищенное HTTP-соединение, а затем обновляться, только если он поддерживает SNI.
Вы можете обнаружить поддержку SNI через:
Удаленный скрипт
С вашей простой HTTP-страницы загрузите
<script>
с целевого HTTPS-сервера SNI, и если скрипт загружается и работает правильно, вы знаете, что браузер поддерживает SNI.Междоменный AJAX (CORS)
Подобно варианту 1, вы можете попробовать выполнить междоменный AJAX-запрос со страницы HTTP к HTTPS, но имейте в виду, что CORS имеет только ограниченную поддержку браузера .
Обнаружение пользовательского агента.
Вероятно, это наименее надежный метод, и вам нужно будет выбрать между черным списком браузеров (и операционных систем), которые, как известно, не поддерживают его, или белым списком известных систем, которые его поддерживают.
Мы знаем, что все версии IE, Chrome & Opera для Windows XP и ниже не поддерживают SNI. Смотрите CanIUse.com для получения полного списка поддерживаемых браузеров .
источник