Posso rilevare se il client SSL non supporta l'indicazione del nome del server e in tal caso fornire il sito Web HTTP standard?


8

Avrò bisogno di usare SSL SNI, ma sfortunatamente da un recente post sul blog Cloudflare solo il 90% della rete lo supporta. Come posso (ad esempio, con nginx) rilevare se il client supporta SNI e fornire / reindirizzare alla versione HTTP del sito Web? È possibile? In quale altro modo non posso perdere il 10% del traffico usando SNI? È corretto supporre che non sarei in grado di reindirizzare il traffico HTTPS su HTTP senza un certificato valido e quindi questa richiesta è impossibile?

Grazie.


Qui è stata posta una domanda strettamente correlata: reindirizzare a SSL solo se il browser supporta SNI
Simon East

Risposte:


10

Se si desidera offrire HTTPS dall'inizio, è necessario fornire un certificato accettato dal client dall'inizio. Perché altrimenti il ​​client non accetterà la connessione SSL e non sarà possibile reindirizzare il client su un sito diverso o su una versione solo HTTP. Questo significa supportare questo caso tu

  • entrambi devono disporre di un unico certificato contenente tutti i domini, in modo da poter fornire ai client non SNI un certificato adeguato. Ma in questo caso non hai bisogno di SNI.
  • oppure devi installare un certificato predefinito che non corrisponde alla maggior parte dei tuoi nomi. In questo caso è possibile fornire al client solo una pagina diversa o reindirizzarla se il client accetta questo certificato non valido.

Se non è necessario disporre di HTTPS dall'inizio, vale a dire se il client di solito si connette prima con un semplice HTTP, è possibile provare a rilevare il supporto SNI in modo da poter reindirizzare il client in un secondo momento. Questo potrebbe essere fatto includendo un'immagine, alcuni JavaScript o cose simili dal tuo sito HTTPS e se il caricamento ha esito positivo, sai che il client supporta SNI o ignora gli errori del certificato.

Naturalmente questo lascia tutto aperto agli attacchi man-in-the-middle, perché tutto ciò che l'uomo-in-the-middle deve fare è servire un certificato diverso o rendere HTTPS non disponibile affatto, perché in questo caso non proverai mai per aggiornare la connessione a HTTPS. Inoltre, può essere usato per far sembrare che i client supportino SNI, se invece lo fa il man-in-the-middle. E non solo i client non SNI ne sono interessati, ma i client che supportano SNI possono solo essere intercettati. Quindi, sebbene ciò sia possibile in teoria, non è raccomandato perché puoi semplicemente manipolare tutto e quindi fare il punto principale dell'uso di HTTPS moot.


0

Come ho pubblicato su StackOverflow , è possibile verificare il supporto SNI solo prima di richiederlo. Cioè, non è possibile forzare gli utenti su HTTPS SNI e quindi ripiegare se non lo supportano, perché riceveranno un errore come questo (da Chrome su Windows XP) senza alcun modo di procedere.

Quindi (purtroppo) l'utente deve effettivamente ricominciare da una connessione HTTP non sicura e quindi essere aggiornato solo se supportano SNI.

È possibile rilevare il supporto SNI tramite:

  1. Script remoto
    Dalla tua semplice pagina HTTP, carica un <script>server HTTPS SNI di destinazione e se lo script viene caricato ed eseguito correttamente, sai che il browser supporta SNI.

  2. AJAX tra domini (CORS)
    Simile all'opzione 1, potresti provare a eseguire una richiesta AJAX tra domini dalla pagina HTTP a HTTPS, ma tieni presente che CORS ha un supporto browser limitato .

  3. Annusare l'agente utente
    Questo è probabilmente il metodo meno affidabile e dovrai decidere se avere una lista nera di browser (e sistemi operativi) noti per non supportarlo, o una lista bianca di sistemi noti che lo fanno.

    Sappiamo che tutte le versioni di IE, Chrome e Opera su Windows XP e versioni precedenti non supportano SNI. Vedi CanIUse.com per l'elenco completo dei browser supportati .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.