È male reindirizzare http su https?


247

Ho appena installato un certificato SSL sul mio server.

Quindi imposta un reindirizzamento per tutto il traffico sul mio dominio sulla porta 80 per reindirizzarlo sulla porta 443.

In altre parole, tutto il mio http://example.comtraffico viene ora reindirizzato alla https://example.comversione appropriata della pagina.

Il reindirizzamento viene eseguito nel mio file Apache Virtual Hosts con qualcosa del genere ...

RewriteEngine on
ReWriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L] 

La mia domanda è: ci sono degli svantaggi nell'utilizzo di SSL?

Dal momento che questo non è un reindirizzamento 301, perderò il collegamento / il posizionamento nei motori di ricerca passando a https?

Apprezzo l'aiuto. Ho sempre desiderato configurare SSL su un server, solo per la pratica di farlo, e alla fine ho deciso di farlo stasera. Finora sembra funzionare bene, ma non sono sicuro che sia una buona idea usarlo su ogni pagina. Il mio sito non è eCommerce e non gestisce dati sensibili; è principalmente per l'aspetto e il brivido di installarlo per l'apprendimento.


NUMERO AGGIORNATO

Stranamente Bing crea questo screenshot dal mio sito ora che utilizza HTTPS ovunque ...

inserisci qui la descrizione dell'immagine


12
[WTF - Non posso aggiungere la risposta (anche se sembra che abbia abbastanza rappresentante).] La mia risposta sarebbe (in parte) che ALCUNI È MALE . Prendi in considerazione l'idea di passare un COOKIE o una chiave API in un GET su HTTP. Se il tuo sito reindirizza le richieste HTTP alle richieste HTTPS, queste chiamate funzionerebbero, ma il COOKIE o la chiave API verranno trasmessi in chiaro. Alcune API disattivano l'HTTP, un approccio più solido: niente HTTP, quindi non puoi nemmeno farlo funzionare se non usi HTTPS. Esempio: "Tutte le richieste API devono essere effettuate tramite HTTPS. Le chiamate effettuate tramite HTTP semplice non riusciranno" da stripe.com/docs/api?lang=php#authentication
codingoutloud

8
@codingoutloud: l'alternativa è che tutto accade su HTTP senza HTTPS. Come va meglio?
Mark Henderson

3
@BenCrowell, perché un portale in cattività assomiglia moltissimo a un sslstripattacco di reindirizzamento di tipo (sono entrambi dirottamenti di richieste man-in-the-middle), quindi i browser HSTS -ware li bloccheranno entrambi.
Jeffrey Hantin,

3
essere consapevoli del fatto che l'utilizzo di HTTPS significa che tutto si include dovrebbe anche essere https o potrebbe non caricare - ad esempio il carico jQuery utilizzando src="://example.com/jquery.js"- nota la mancanza di httpo httpsin modo che il browser carica quella appropriata. Ho avuto un incubo nel tentativo di caricare correttamente alcune cose Amazon incorporate poiché l'API (caricata tramite https) produceva collegamenti http - il che significa che non funzionavano correttamente fino a quando non ho trovato il parametro non documentato per attivare / disattivare i collegamenti https
Basic

3
Jason; l'aggiornamento dovrebbe essere una nuova domanda, probabilmente su Webmaster in quanto non è correlato (tecnicamente) alla domanda originale. Ma è probabile che i tuoi fogli di stile provengano da un dominio non sicuro.
Mark Henderson

Risposte:


316

La [R]bandiera da sola è un 302reindirizzamento ( Moved Temporarily). Se vuoi davvero che le persone utilizzino la versione HTTPS del tuo sito (suggerimento: sì), dovresti utilizzare [R=301]un reindirizzamento permanente:

RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L] 

A 301mantiene intatti tutti i tuoi cercapersone google-fu e sudati . Assicurati che mod_rewritesia abilitato:

a2enmod rewrite

Per rispondere alla tua domanda esatta:

È male reindirizzare http su https?

Diavolo, no. È molto buono.


3
Grazie per le informazioni, il mio capo mi sta dicendo il motivo per cui esegue https solo su determinate pagine del suo sito, è che utilizza molte più risorse del server per eseguirlo su ogni pagina. Ne sai qualcosa o se è vero?
JasonDavis,

9
@jasondavis Solo se non passi qualche minuto per ottimizzarlo .
Michael Hampton

10
"utilizza molte più risorse del server per eseguirlo su ogni pagina." Le moderne CPU hanno funzionalità di accelerazione della crittografia che rendono SSL quasi gratuito. Non preoccuparti per le spese generali.
Adam Davis,

41
@AdamDavis L'algoritmo di crittografia può essere leggero, ma l'overhead dell'handshake esiste ancora. Inoltre, HTTPS impedisce ai proxy HTTP di memorizzare nella cache i contenuti. Nella maggior parte dei casi, il sovraccarico di HTTPS è minimo e utile, ma fai attenzione a non generalizzare eccessivamente.
200_successo

6
Elimina la cache condivisa, che è utile per i modelli di utilizzo di alcuni siti e spesso protegge poco (è importante che le persone possano sapere che hai visitato il sito, ma non i dettagli di ciò che hai fatto? Questa è l'unica situazione in cui SSL è utile). Il vantaggio principale di SSL su ogni risorsa non è che è necessario "proteggere", ad esempio le persone che guardano "chi siamo", ma che non si può sbagliare e non utilizzarlo nel caso in cui si debba.
Jon Hanna,

49

Pur supportando l'idea dei soli siti SSL, direi che uno svantaggio sono le spese generali a seconda del design del tuo sito. Voglio dire, ad esempio, se stai offrendo molte singole immagini nei tag img, questo potrebbe rallentare il tuo sito. Consiglio a chiunque utilizzi solo server SSL di assicurarsi che funzionino su quanto segue.

  1. Controllare l'intero sito per i collegamenti interni e assicurarsi che tutti stiano utilizzando HTTPS se si specifica il proprio nome di dominio nei collegamenti, quindi non si stanno causando i propri reindirizzamenti.
  2. Aggiorna <meta property="og:url"a utilizzando la versione https del tuo dominio.
  3. Se si utilizza di <base href=nuovo l'aggiornamento per utilizzare HTTPS.
  4. Installare il protocollo SPDY se possibile
  5. Assicurati di utilizzare gli sprite CSS Image ove possibile, per ridurre il numero di richieste.
  6. Aggiorna le tue sitemap per indicare lo stato https, in modo che gli spider nel tempo apprendano questo cambiamento.
  7. Modifica le preferenze del motore di ricerca come Strumenti per i Webmaster di Google per preferire HTTPS
  8. Ove possibile, scaricare tutti i supporti stattici sui server CDN HTTPS.

Se quanto sopra è affrontato, allora dubito che avrai molti problemi.


SPDY è un buon suggerimento; ci sembra anche essere un modulo aggiungendo il supporto SPDY ad Apache 2.x .
Calrion,

18
L'uso di "//yourserver.com/some-uri" invece di " yourserver.com/some-uri " risolve il problema (1) perché il browser selezionerà lo schema appropriato (http o https) in base allo schema con cui è stata caricata la pagina .
MauganRa,

1
@MauganRa A meno che, ovviamente, non si tratti di un collegamento dalla pagina dell'articolo http alla pagina di accesso https, ad esempio.
Mołot,

4
Google vede l'URL che qualcuno sta visitando tramite l' Refererintestazione. Ad esempio, questo sito utilizza jQuery dal CDN di Google e il mio browser invia una richiesta a Google ogni volta che ricarico il sito. In tal modo Refererviene anche inviata un'intestazione a Google che è impostata sull'URL di questo sito. Quindi Google può tracciare i siti che visito nel momento in cui il mio indirizzo IP non cambia (e se utilizzo un servizio Google durante questo periodo, Google può anche collegare queste informazioni con il mio account Google).
Stephan Kulla,

1
Per 1) Ho appena fatto una ricerca e la sostituzione nel mio database MySQL http per https ... sto usando WordPress in modo da rendere davvero semplice l'aggiornamento di centinaia di collegamenti
JasonDavis

38

Ho impostato https, quindi dovresti usarlo ovunque sul sito. Eviterai il rischio di problemi con contenuti misti e se disponi degli strumenti richiesti, perché non rendere sicuro l'intero sito?

Per quanto riguarda il reindirizzamento da http a https, la risposta non è così semplice.

Il reindirizzamento renderà molto più facile per i tuoi utenti, digitano semplicemente whateversite.com e vengono reindirizzati a https.

Ma. Cosa succede se l'utente a volte si trova su una rete non protetta (o è vicino a Troy Hunt e al suo Pineapple )? Quindi l'utente richiederà http://whateversite.com per vecchia abitudine. Questo è http. Questo può essere compromesso. Il reindirizzamento potrebbe puntare a https://whateversite.com.some.infrastructure.long.strange.url.hacker.org . A un utente normale sembrerebbe abbastanza legittimo. Ma il traffico può essere intercettato.

Quindi abbiamo due requisiti in competizione qui: essere facili da usare ed essere sicuri. Fortunatamente, esiste un rimedio chiamato intestazione HSTS . Con esso è possibile abilitare il reindirizzamento. Il browser passerà al sito sicuro, ma grazie all'intestazione HSTS ricordalo anche. Quando l'utente digita whateversite.com seduto su quella rete non sicura, il browser passerà immediatamente a https, senza saltare il reindirizzamento su http. A meno che tu non abbia a che fare con dati molto sensibili, penso che sia un giusto compromesso tra sicurezza e usabilità per la maggior parte dei siti. (Quando di recente ho creato un'applicazione per la gestione delle cartelle cliniche sono andato su tutte le https senza reindirizzamento). Purtroppo Internet Explorer non ha supporto per HSTS ( fonte), quindi se il tuo pubblico di destinazione utilizza principalmente IE e i dati sono sensibili, potresti voler disabilitare i reindirizzamenti.

Quindi, se non stai prendendo di mira gli utenti IE, vai avanti e usa il reindirizzamento, ma abilita anche l'intestazione HSTS.


Anche più persone devono prestare attenzione a questo. Un'altra cosa è che le persone presumono che siano sicure perché l'end point è HTTPS, ignorando il fatto che tutte le informazioni inviate alla pagina in GET o POST sono in chiaro.
Velox,

3
@Velox - Non penso che le implicazioni di "le persone credano che siano sicure perché il punto finale è HTTPS, ignorando il fatto che tutte le informazioni inviate alla pagina in GET o POST sono in chiaro" è abbastanza preciso. Mentre ci sono alcuni gotcha, i parametri della query GET non viaggiano in chiaro durante il trasporto su HTTPS. Vedere ad esempio: stackoverflow.com/questions/323200/… Anche i payload POST sono protetti, anche se non vulnerabili alle intestazioni di registrazione e referrer.
codingoutloud

@codingoutloud Questo è il mio punto. Su HTTPS sono crittografati, ma nella richiesta iniziale alla pagina HTTP non lo erano.
Velox,

1
@Velox - Se l'intero sito viene reindirizzato a HTTPS, è improbabile che vengano inviati parametri GET prima che HTTPS venga avviato (e tutto rimarrà HTTPS dopo quel punto). C'è ancora l'unica richiesta iniziale a cui verranno inviati i cookie, a cui è possibile porre rimedio con HSTS ... e una piccola finestra di attacco per SSLStrip, che potrebbe essere sconfitta da JavaScript, ma è una corsa agli armamenti a sé stante.
Brilliand,

@Brilliand Il punto giusto, ma un punto debole nella sicurezza rende l'intera cosa debole. Vale sempre la pena considerare.
Velox,

22

Non c'è nulla di sbagliato in questo, e in effetti è la migliore pratica (per i siti che dovrebbero essere serviti su una connessione sicura). In effetti, quello che stai facendo è abbastanza simile alla configurazione che sto usando:

<VirtualHost 10.2.3.40:80>
  ServerAdmin me@example.com
  ServerName secure.example.com
  RedirectMatch 301 (.*) https://secure.example.com$1
</VirtualHost>

# Insert 10.2.3.40:443 virtual host here :)

Il 301codice di stato indica un reindirizzamento permanente , che indica ai client in grado di utilizzare l'URL sicuro per connessioni future (ad es. Aggiornare il segnalibro).

Se servirai il sito solo su TLS / SSL, ti consiglierei un'ulteriore direttiva per abilitare HTTP Strict Transport Security (HSTS) nel tuo host virtuale sicuro :

<IfModule mod_headers.c>
  Header set Strict-Transport-Security "max-age=1234; includeSubdomains"
</IfModule>

Questa intestazione indica ai client capaci (la maggior parte di questi in questi giorni, credo) che dovrebbero usare HTTPS con il dominio fornito ( secure.example.com, in questo caso) per i 1234secondi successivi . La ; includeSubdomainsparte è facoltativa e indica che la direttiva si applica non solo al dominio corrente, ma anche a qualsiasi altro ambito (ad es alpha.secure.example.com.). Si noti che l'intestazione HSTS è solo accettata dai browser quando servito su una connessione SSL / TLS!

Per testare la configurazione del server in base alle best practice correnti, una buona risorsa gratuita è il servizio Test server SSL di Qualys ; Mirerei a segnare almeno un A- (non puoi ottenerne di più con Apache 2.2 a causa della mancanza di supporto per la crittografia a curva ellittica).


Dovrei aggiungere, l'invio dell'intestazione Strict-Transport-Security: max-age=0annullerà qualsiasi direttiva precedente; come sempre, questo deve essere inviato su HTTPS per essere accettato, ma è un modo pratico di annullare le cose se si decide che è necessario utilizzare anche HTTP sul dominio.
Calrion,

5

Wow ! il reindirizzamento da HTTP a HTTPS è un'ottima cosa e non posso vedere alcun inconveniente per questo.

Assicurati solo che i tuoi clienti dispongano della CA giusta per evitare avvisi non intuitivi sul certificato nel browser.

Inoltre, il modo in cui hai configurato Apache per reindirizzare a HTTPS sembra ok.


5

È male reindirizzare http su https?

No, per niente. In realtà, è una buona cosa da fare!

Su reindirizzamenti:

Potrebbe essere più efficiente, eliminando completamente le riscritture . Ecco la mia configurazione su una situazione simile ...

<VirtualHost *:80>
  ServerName domainname.com

  <IfModule mod_alias.c>
    Redirect permanent / https://domainname.com/
  </IfModule>
</VirtualHost>

4

HTTPS non è esattamente infallibile. Naturalmente, forzare normalmente HTTPS è una buona cosa. Impedisce ai criminali normali di fare qualcosa di male ai tuoi utenti.

Ma ricorda di controllare le tue impostazioni SSL come l'impostazione SSLCiphers. Disabilita cose come RC4 crypto, il protocollo SSLv2 e SSLv3. Inoltre, dovresti scoprire se i libarys di sistema crittografico del tuo sistema supportano TLS1.2 (che è la cosa che vuoi avere;))

Attiva SSL, è una buona cosa.


L'entropia non si esaurisce ( almeno se stai difendendo dagli attaccanti terrestri piuttosto che fare voodoo ). O inizi con un'entropia insufficiente e non puoi fare nulla che richieda casualità, oppure inizi con un'entropia sufficiente e continui ad avere entropia sufficiente, indipendentemente dalla casualità che generi.
Gilles,

Scusa cosa ? Esistono diverse operazioni su Linux che insistono sull'entropia forte derivata dall'hardware piuttosto che sull'entropia probabilmente abbastanza buona basata sul PRNG, e quelle possono effettivamente bloccare se la profondità del pool è bassa. È certamente possibile iniziare con entropia sufficiente su un sistema Linux, ma con un uso eccessivo per drenare il pool, causando il blocco di alcune operazioni.
MadHatter,

3

Personalmente sono tutto per l'uso di SSL per proteggere le connessioni sul Web, tuttavia ritengo che tutte le altre risposte qui perse sia che non tutti i dispositivi e tutti i software in grado di stabilire una connessione HTTP saranno in grado di utilizzare SSL, quindi prenderei in considerazione la possibilità di offrire agli utenti un modo per evitarlo se non è supportato per loro. È anche possibile che le persone in alcuni Paesi in cui la tecnologia di crittografia sia illegale non possano accedere al tuo sito. Vorrei prendere in considerazione l'aggiunta di una pagina di destinazione non crittografata con un collegamento per forzare la versione non sicura del sito, ma a meno che un utente non scelga specificamente tale da fare come hai detto e li inoltri alla versione HTTPS.


Un problema con soluzioni come avere una semplice landing page HTTP, anche se adeguatamente separata, è che questa pagina è lasciata aperta alla manipolazione. Vale a dire, non esiste alcuna garanzia effettiva che il link per la versione HTTPS del sito venga consegnato intatto ai visitatori.
Håkan Lindqvist,

3

Ecco alcuni dei grandi problemi di pennellata:

  • MITM / SSLSTRIP : questo è un avvertimento enorme. Se hai intenzione di pubblicare il tuo sito su HTTPS, disabilita HTTP sul sito . Altrimenti, lasci i tuoi utenti aperti a vari attacchi man-in-the-middle, incluso SSLSTRIP, che intercettano le richieste e le servono silenziosamente su HTTP, inserendo il loro script malware nel flusso. Se l'utente non se ne accorge, allora penserà che la sua sessione è sicura quando in realtà non lo è.

    • Il problema con questo, tuttavia, è che se il tuo sito è un sito pubblico e disabiliti senza troppe cerimonie HTTP, potresti perdere molti visitatori. Probabilmente non sarà nemmeno verificarsi a loro per cercare HTTPS se il sito non verrà caricato con HTTP.
  • Se il tuo sito richiede un accesso sicuro, l'intera sessione utente deve essere protetta. Non eseguire l'autenticazione su HTTPS, quindi reindirizzare l'utente su HTTP. Se lo fai, ancora una volta, stai lasciando i tuoi utenti vulnerabili agli attacchi MITM. Al giorno d'oggi l'approccio standard all'autenticazione consiste nell'autenticare una volta, quindi passare un token di autenticazione avanti e indietro (in un cookie). Ma se esegui l'autenticazione su HTTPS e reindirizzi a HTTP, un man-in-the-middle può intercettare quel cookie e utilizzare il sito come se fosse un utente autenticato, ignorando la tua sicurezza.

  • I problemi di "prestazioni" con HTTPS sono per tutti gli scopi pratici limitati alla stretta di mano coinvolta nella creazione di una nuova connessione. Fai il possibile per ridurre al minimo la necessità di più connessioni HTTPS da un URL e sarai a miglia di distanza. E questo è francamente vero anche se stai offrendo i tuoi contenuti su HTTP. Se leggi su SPDY, ti renderai conto che tutto ciò che fa è orientato verso il tentativo di servire tutto il contenuto da un singolo URL su una singola connessione. Sì, l'utilizzo di HTTPS influisce sulla memorizzazione nella cache. Ma quanti siti web sono solo contenuti statici e memorizzabili nella cache in questi giorni, comunque? È probabile che tu guadagni di più per il tuo buck utilizzando la cache sul tuo server web per ridurre al minimo le query ridondanti sul database che recuperano continuamente dati invariati e impediscono l'esecuzione di costosi percorsi di codice più spesso del necessario.


La cosa che puoi fare per affrontare effettivamente sslstrip è usare HSTS (preferibilmente ottenere le tue impostazioni HSTS precaricate ). A prescindere dal fatto che tu accetti o meno richieste tramite HTTP semplice, un MITM può rispondere su HTTP semplice (eventualmente inoltro al tuo sito HTTPS) anche se accetti solo richieste HTTPS.
Håkan Lindqvist,

@ HåkanLindqvist Ho davvero guadagnato un downvote da te? Ho dato consigli sbagliati o buoni consigli in merito alla non autenticazione su HTTPS e al passaggio a HTTP per il resto della sessione? Ho fornito cattivi consigli in merito ai miti delle prestazioni HTTPS? Inoltre, se il client tenta inizialmente di connettersi tramite HTTPS, il MITM non può intercettare e rispondere senza attivare un avviso nel browser, poiché il loro certificato non corrisponderà a meno che non abbiano un certificato rubato o falsificato correttamente. D'altra parte, se il sito accetta una connessione HTTP, l'intercettazione è più semplice. In entrambi i casi, HTTPS alza l'asticella.
Craig,

..e ovviamente concordo pienamente con l'utilizzo dell'HSTS.
Craig,

Il mio problema con la risposta è il primo elemento nell'elenco che afferma di rivolgersi a sslstrip mentre in realtà non lo fa (parlando di miti). Quello che stavo cercando di ottenere nel mio commento iniziale è che se hai un MITM attivo (che è quello che ti serve per sslstrip in primo luogo), l'aggressore può essenzialmente essere "il sito" dal punto di vista del cliente; è l'aggressore che decide se desidera accettare connessioni HTTP semplici dal client, il modo in cui il proprio server Web si comporta in tal senso non influisce su ciò che l'attaccante può o farà.
Håkan Lindqvist,

@ HåkanLindqvist Tranne il fatto che se il visitatore sta intenzionalmente cercando di connettersi con HTTPS, l'attaccante non può soddisfare quella richiesta senza lanciare bandiere nel browser, a meno che non siano riusciti a rubare un certificato del server o in qualche modo a forgiarlo con successo, che dovrebbero fare per cambiare la connessione a HTTP. HTTPS alza ancora il livello. Naturalmente se il visitatore effettua il tentativo di connessione iniziale su HTTP, tutte le scommesse sono completamente disattivate.
Craig,

1

Questa non è tecnicamente una risposta alla tua domanda originale, ma se usi l'estensione HTTPS di Google Chrome ovunque (sono sicuro che ci sono estensioni simili su altri browser), l'estensione reindirizza automaticamente i siti con HTTP allo stesso sito con HTTPS. Lo uso da un po 'e non ho avuto problemi (tranne forse il rallentamento, ma non l'ho provato). HTTPS Ovunque può essere modificato da determinate regole sul lato server, ma poiché non ho fatto molto in quella zona, non sono sicuro dei dettagli esatti.

Tornando alla tua vera domanda, se usi qualcosa come HTTPSEwherewhere, c'è ancora meno incentivo a usare solo HTTP, anche se immagino sia difficile impostare regole corrette per quando ne hai bisogno.


1

the only technical draw back to HTTPS over HTTP is that it is computationally more expensive to process HTTPS requests than plain HTTP

However given that most modern servers have high powered CPU's this impact is usually negligible unless you are at extremely high levels of traffic at which point you are more than likely using load balancers anyway

With the advent of protocols like SPDY which require SSL/TLS to work, this actually counteracts the aforementioned computational overhead by giving significant performance improvements with regards to multiple requests and getting assets to the client faster overall.


The issue with HTTPS performance is that establishing a new connection is more expensive because there are more round-trips involved and because asymmetrical encryption/decryption is a lot more expensive than symmetrical encryption/decryption. Once the connection handshake establishes a shared symmetrical encryption key, the ongoing overhead is virtually irrelevant (very small). If you read up on SPDY, you'll see that the goal of all the fancy stuff it does is essentially to serve all the content from a URL over a single connection, mitigating the connection handshake overhead.
Craig

1

It is very good to redirect to https, but I read it also depends on how you organize the redirecting.

Making a dedicated virtual server for redirecting the incoming http requests to your https connection as suggested in the answer on security.stackexchange.com sounds very smart and will close some additional security threats. A configuration in Apache would look something like this:

# Virtual host for rerouting
<VirtualHost *:80>
    ServerName www.example.com
    Redirect permanent / https://www.example.com/
</VirtualHost>

# Virtual host for secure hosting on https
<VirtualHost *:443>
    ServerName www.example.com
    SSLEngine on
    Header set Strict-Transport-Security "max-age=8640000;includeSubdomains"

    ...site settings...

</VirtualHost>
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.