Pytanie Wykrywanie obsługi przeglądarki SNI (Server Name Indication) w javascript


Chcę być w stanie wykryć, czy przeglądarka obsługuje SNI - Wskazanie nazwy serwera. Mam nadzieję, że przekieruję klientów, którzy nie są zgodni, na inny adres.

Zastanawiam się nad ładowaniem niektórych treści za pomocą protokołu SSL i upewniam się, że został on bezpiecznie przeniesiony. W przeciwnym razie przeglądarka nie obsługuje SNI. Czy można to zrobić?


12
2017-07-28 14:20


pochodzenie




Odpowiedzi:


Możesz skonfigurować serwer obsługujący SNI, obsługujący dwie nazwy hostów, gdzie potrzebujesz SNI i jeden, który jest rozwiązaniem awaryjnym, obsługującym nazwę, którą hostuje.

Coś w stylu:

  • https://www.example.com/name zwraca wypowiedź reprezentującą I'm www.example.com
  • https://www.example.net/name zwraca I'm www.example.net (i wymaga SNI).

Jeśli poprosisz o XHR https://www.example.net/name i wraca www.example.com, wtedy przeglądarka nie obsługuje SNI.


4
2017-07-28 15:15



Musisz mieć pewność, że w przypadku braku SNI serwer zgłosi witrynę www.example.com. Jeśli dobrze pamiętam, Apache służy pierwszy certyfikat jest ładowany, gdy nie ma żadnego SNI. - Andreas
Tak, to właśnie miałem na myśli przez rozwiązanie awaryjne: wartość domyślną. W razie potrzeby możesz połączyć się z obydwoma i porównać to, co otrzymasz. - Bruno
To brzmi jak dobry pomysł. Mam zamiar przetestować to, to będzie działać dla mnie. - Andres Olarte


Nie jestem pewien, czy tego chce, ale jest to

  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]

Jeśli stara przeglądarka próbowała użyć witryny, która potrzebuje SNI, zostanie przekierowana (w tym przypadku z powrotem do http i strony mówiącej, że przeglądarka jest za stara). Ale zawsze otrzymasz błąd. Tego nie da się uniknąć. Przeglądarka mówi cześć IP ...., a odpowiedzi na apache witam oto mój certyfikat. Jeśli przeglądarka nie dostarcza SNI w hello apache, po prostu wysyła domyślny (tj. Nieprawidłowy) certyfikat. Browser następnie narzeka.

Jeśli chcesz wybrać to z http przed zamianą na https, możesz umieścić coś takiego w htaccess

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

A następnie na stronie wykonaj pobieranie https z domyślnej domeny (domyślnie tak przeglądarka nie mówi, że jest błąd bezpieczeństwa). Jeśli SNI działa, w php $ _SERVER ['SSL_TLS_SNI'] będzie miała nazwę domeny, w przeciwnym razie będzie miała% {SSL: SSL_TLS_SNI}. Ten fragment kodu można poprawić, ale masz pomysł.


1
2017-10-10 15:58



Nie sądzę, aby przeglądarka kiedykolwiek widziała przekierowanie, jeśli nie uda się uzgadniać protokołu SSL, więc nie sądzę, aby przekierowanie na podstawie SSL_TLS_SNI zmienna zadziała. - Simon East


Możesz testować tylko na wsparcie SNI wcześniejszy wymagać tego. Oznacza to, że nie można wymuszać na użytkownikach SNI HTTPS, a następnie wycofywać, jeśli nie obsługują go, ponieważ otrzymają taki błąd (z Chrome w systemie Windows XP) bez możliwości kontynuowania.

Tak więc (niestety) użytkownik musi zacząć od niezabezpieczonego połączenia HTTP, a następnie uaktualnić go tylko wtedy, gdy obsługuje SNI.

Możesz wykryć wsparcie SNI przez:

  1. Zdalny skrypt
    Z prostej strony HTTP załaduj <script> z docelowego serwera SNI HTTPS i jeśli skrypt ładuje się i działa poprawnie, wiesz, że przeglądarka obsługuje SNI.

  2. Cross-Domain AJAX (CORS)
    Podobnie jak w opcji 1, możesz spróbować wykonać żądanie AJAX między domenami ze strony HTTP do HTTPS, ale pamiętaj, że CORS ma tylko ograniczona obsługa przeglądarki.

  3. Powąchaj agent użytkownika
    Jest to prawdopodobnie najmniej niezawodna metoda i musisz zdecydować, czy nie ma czarnej listy przeglądarek (i systemów operacyjnych), które ją obsługują, czy białej listy znanych systemów, które ją obsługują.

    Wiemy, że wszystkie wersje IE, Chrome i Opera w systemie Windows XP i poniżej nie obsługują SNI. Widzieć CanIUse.com dla pełnej listy obsługiwanych przeglądarek.


1
2017-09-06 05:28





Odkąd commercerack został zaktualizowany do SNI dla wszystkich witryn, mieliśmy ten sam problem. (Użytkownicy rozpoczynający kasę i otrzymujący nieprzyjemny problem z SSL).

Możesz to wykorzystać jako punkt wyjścia. Wraz z rozwojem listy przeglądarek zaktualizuję ją, ale teraz mam IE na XP + Android 2.0-2.2.

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


0
2018-03-28 19:20



Błąd w linii 83? if (/Android\s2\.[012012+/) {browserSNICompatibility = 0; } ... nie widzisz ciągu var, aby użyć wyrażenia regularnego? - Kevin_Kinsey