Aggiorna la connessione HTTP a SSL / TLS


8

Al momento ho un server che reindirizza automaticamente tutte le richieste HTTP al sito HTTPS equivalente. Il problema è che alcuni browser non accettano il certificato SSL (StartSSL.com) o non supportano SNI, pertanto ricevono un avviso Certificato e l'utente non continuerà a navigare sul sito Web.

Esiste un meccanismo che tenta di fare in modo che il browser usi HTTPS invece del semplice HTTP e quando ciò non funziona (ad esempio il certificato non è accettato o SNI non supportato) continua a utilizzare HTTP.

Attualmente sto usando Apache 2.4 con più host virtuali con cui tutti reindirizzano la connessione HTTP Redirect / https://domain.example/.


3
Passare da HTTPS a HTTP quando un certificato non è corretto, cosa che non dovresti mai voler accadere come visitatore. Il fatto che un certificato sia errato dovrebbe essere un segno che è qualcosa di sbagliato, ripristinare una connessione non crittografata è la cosa peggiore che potresti fare allora. La migliore soluzione che hai è quella di correggere il tuo certificato in modo che corrisponda al tuo nome host (s), utilizzando un'altra CA o non SNI.
Teun Vink,

Ok capito. Ma quando prevediamo che esiste un browser che non supporta le connessioni HTTPS o che non supporta i meccanismi di crittografia forniti dal server. Quindi quel client non ha (nel mio caso) alcuna possibilità di utilizzare il sito, perché reindirizzo automaticamente al sito equivalente HTTPS.
foxylion,

Nel mondo di oggi è del tutto possibile superare questa limitazione. I siti più importanti hanno solo il passaggio a SSL. Se possono farlo, puoi farlo.
MichelZ,

Risposte:


15

Un browser non dovrebbe mai eseguire il downgrade da solo a http se https non funziona, poiché tutto ciò che un utente malintenzionato dovrebbe fare è rendere https non disponibile (ad esempio la porta di blocco 443). Quindi l'unico modo per farlo è istruire il browser dal server a farlo, ad esempio inviando un reindirizzamento http. Naturalmente questo dovrebbe essere inviato su una connessione sicura (altrimenti un man-in-the-middle potrebbe falsarlo) ma sfortunatamente è proprio il tuo problema che la connessione sicura fallisca.

In sintesi: No, non è possibile ed è meglio così.

A proposito, tutti i browser moderni supportano SNI, ma non tutte le applicazioni (es. App Java ecc.). Se disponi di più domini sul server Web ma solo uno richiesto da queste app, puoi impostare il certificato per questo dominio come predefinito. Altrimenti dovresti ottenere un certificato (più costoso) che contiene tutti i domini necessari come nomi alternativi soggetto.

Modifica con un'altra idea: quello che potresti provare a fare è scaricare un'immagine dalla tua parte come https e verificare il successo con un gestore onerror sul tag img. Forse questo non attiva un avviso visibile dall'utente ma non riesce a caricarsi. E se riesce, sai che l'accesso https è possibile e reindirizza l'utente.

A parte questo, devi chiederti perché vuoi offrire https, se accetti anche l'accesso con http. O ci sono dati che dovrebbero essere protetti o che non lo sono. Finché offri un fallback a http, è facile per un utente malintenzionato imporre http anziché https.


1
Molto ben affermato.
Tim Brigham,

3

Innanzitutto dovrebbe essere possibile specificare un certificato da utilizzare per tutti i client che non dispongono del supporto SNI. Questo significa che per tutti i domini ospitati su quell'indirizzo IP, puoi averne almeno uno che lavora per client senza SNI.

Ciò che si potrebbe fare quando si reindirizza da http a https è un reindirizzamento in due fasi. Il primo reindirizzamento da http a https utilizza il nome di dominio, che si è assicurato che funzionasse con o senza supporto SNI. L'URL originale completo dovrebbe essere incluso, in modo che da questo sito https sia possibile reindirizzare a quello corretto in seguito.

Il nome di dominio, che funziona con o senza SNI, può comportarsi diversamente a seconda che SNI sia supportato dal client. In questo modo sapresti che il client ha supportato SNI prima di reindirizzarlo a un dominio, che ha richiesto SNI.

Come configurarlo esattamente su Apache sarà un po 'di ipotesi da parte mia (dal momento che non ho mai configurato Apache con più di un certificato). Immagino che il modo per farlo sarebbe quello di creare host virtuali basati sul nome per tutti i domini incluso il dominio intermedio.

Quindi creare un host virtuale predefinito per i client senza SNI, che utilizza lo stesso certificato di quello che utilizza il nome. Quei due host virtuali con lo stesso certificato, invieranno reindirizzamenti diversi ai client a seconda che supportino SNI.

Infine, abiliterei IPv6 sul server. Con IPv6 hai abbastanza indirizzi IP che puoi assegnare ad ogni host virtuale. Lo stesso set di host virtuali può essere basato sul nome IPv4 e IP basato su IPv6, quindi non è necessario duplicare alcuna configurazione in questo modo.

Il risultato finale sarebbe un'installazione che funziona fintanto che il client supporta SNI o IPv6. Solo i client che non supportano nessuno di questi avranno un problema, ma sarai comunque in grado di rilevare quelli e server un reindirizzamento diverso o un messaggio di errore.

Per quanto riguarda i clienti a cui non piace la CA, il mio unico suggerimento è di riconoscerli dal loro user-agent e gestirli come sembri appropriato. Assicurati di avere un link al sito https, sul quale possono fare clic nel caso in cui tu abbia incluso per errore troppi client.


0

Solo un'ipotesi selvaggia: potrebbe non essere una direttiva SSLCertificateChainFile nella configurazione di Apache che include il file sub.class1.server.ca.pem necessario per StartSSL?


No, tutto funziona bene, ma alcuni vecchi browser non supportano SNI o non si fidano di StartSSL.com. Il problema è che questi visitatori non hanno la possibilità di visualizzare la pagina senza ignorare l'avvertimento del certificato (che non è una soluzione).
foxylion,
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.