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ć?
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.
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ł.
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:
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.
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.
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.
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