Подтвердить что ты не робот

Обнаружение поддержки SNI (имя сервера) браузера в javascript

Я хочу, чтобы определить, поддерживает ли браузер SNI - указание имени сервера. Я надеюсь перенаправить несовместимых клиентов на другой адрес.

Я подумывал загрузить контент через SSL и убедиться, что он был надежно переведен. В противном случае браузер не поддерживает SNI. Это можно сделать?

4b9b3361

Ответ 1

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

Что-то по строкам:

  • https://www.example.com/name возвращает представление, говорящее I'm www.example.com
  • https://www.example.net/name возвращает I'm www.example.net (и требует SNI).

Если вы сделаете запрос XHR на https://www.example.net/name и он вернет www.example.com, тогда браузер не поддерживает SNI.

Ответ 2

Не уверен, что это то, чего хочет, но есть этот

  RewriteEngine on

  # Test if SNI will work and if not redirect to too old browser page
  RewriteCond %{HTTPS} on
  RewriteCond %{SSL:SSL_TLS_SNI} =""
  RewriteRule ^ http://www.example.com/too-old-browser [L,R=307]

Если старый браузер попытался использовать сайт, для которого требуется SNI, он будет перенаправлен (в этом случае вернитесь к http и странице, говорящей, что браузер слишком старый). Но вы всегда получите ошибку. Этого нельзя избежать. Браузер приветствует IP...., а apache отвечает привет здесь, это мой сертификат. Если браузер не предоставляет SNI в приветствии, apache просто отправляет сертификат по умолчанию (то есть неверный). Браузер затем жалуется.

Если вы хотите выбрать это из http перед переходом на https, вы можете добавить что-то вроде этого в htaccess

  #Set $_SERVER['SSL_TLS_SNI'] for php = %{SSL:SSL_TLS_SNI} or value
  SetEnv SSL_TLS_SNI %{SSL:SSL_TLS_SNI}

И затем на вашей странице сделайте выбор https из домена по умолчанию (по умолчанию браузер не говорит о наличии ошибки безопасности). Если SNI работает, то в php $_SERVER ['SSL_TLS_SNI'] будет иметь доменное имя, иначе оно будет иметь {SSL: SSL_TLS_SNI}. Этот бит кода может быть улучшен, но вы получите эту идею.

Ответ 3

Вы можете протестировать только поддержку SNI до его требования. То есть вы не можете принуждать пользователей к SNI HTTPS, а затем отступать, если они не поддерживают его, потому что они получат такую ​​ошибку (от Chrome в Windows XP) без возможности продолжить.

iCLH5.png

Итак (к сожалению) пользователь должен фактически начать с небезопасного HTTP-соединения, а затем обновиться только в том случае, если он поддерживает SNI.

Вы можете обнаружить поддержку SNI с помощью:

  • Удаленный script
    С вашей простой HTTP-страницы загрузите <script> с вашего сервера SNI HTTPS назначения и если script загружается и работает правильно, вы знаете, что браузер поддерживает SNI.

  • Междоменной AJAX (CORS)
    Как и в случае с вариантом 1, вы можете попробовать выполнить междоменный запрос AJAX с HTTP-страницы на HTTPS, но имейте в виду, что CORS поддерживает только ограниченную поддержку браузера.

  • Снимите пользовательский агент
    Это, вероятно, наименее надежный метод, и вам нужно будет решить, может ли черный список браузеров (и операционных систем) не поддерживать его, или белый список известных систем.

    Мы знаем, что все версии IE, Chrome и Opera в Windows XP и ниже не поддерживают SNI. См. CanIUse.com для полного списка поддерживаемых браузеров.

Ответ 4

Так как commercerack обновлен до SNI для всех сайтов, у нас была такая же проблема. (Пользователи начинают проверку и получают неприятную проблему с SSL).

Не стесняйтесь использовать это как отправную точку. Поскольку список браузеров растет, я обновляюсь, но сейчас IE на XP + Android 2.0-2.2.

https://github.com/brianhorakh/html-sni-useragent-sniffer-warning