HTTPS è HTTP-entro-SSL. SSL è un protocollo tunnel: funziona su un flusso bidirezionale esistente per i dati e fornisce a flusso bidirezionale per i dati. Le due parti coinvolte in SSL sono il client e il server , che sono due ruoli all'interno del protocollo SSL; non è necessario che questi ruoli siano associati alle nozioni di "client" e "server" del protocollo di trasporto sottostante.
Ad esempio, è possibile immaginare una configurazione in cui il sistema client (C) avvia una connessione TCP al server (S), quindi il server avvia un handshake SSL, agendo come client SSL (cioè inviando il messaggio ClientHello
, invece di aspettare un ClientHello
in arrivo). Questo inverte i ruoli di entrambe le macchine e anche le garanzie di sicurezza: la macchina S avrà una buona idea dell'identità del client connesso C, ma il client C non sarà sicuro di quale server S sta parlando (un attaccante potrebbe aver intercettato e reindirizzato la comunicazione). A seconda del contesto, questo può o non può essere appropriato.
Tuttavia, ciò si discosta da HTTPS , in cui il client TCP è anche il client SSL e che il client si aspetta che server per mostrare un certificato, che il client convaliderà con la sua CA conosciuta e attendibile e che contiene il nome del server previsto (come estratto dall'URL, vedi sezione 3.1 ). Corrispondentemente, i client esistenti (browser Web) non supportano l'inversione dei ruoli SSL. Se la tua situazione richiede l'utilizzo di browser, devi ovviamente utilizzare solo le funzionalità disponibili nei browser.
SSL supporta alcune suite di crittografia senza certificato. Le suite di cifrari "DH_anon" sono ritenute deboli, perché non implicano alcuna autenticazione (quindi, Man-in- gli attacchi di mezzo-centrale sono possibili). Le suite di crittografia PSK implicano l'autenticazione reciproca di client e server per quanto riguarda un segreto condiviso. Quando il segreto condiviso è di bassa entropia (per esempio, è una password ), SRP cifra le suite sono migliori.
Anche in questo caso, queste suite di crittografia non sono (ancora) disponibili nei browser tradizionali (anche se alcune persone sono lavorando su di esso ). Richiedono un segreto condiviso (chiave o password), una condizione che può essere o non essere facile da ottenere nel tuo contesto specifico.
Se la conoscenza dell'identità del server non è importante, è possibile fornire al server un certificato autofirmato, insieme alle istruzioni per i client su come abilitare il proprio browser ad accettare il certificato del server senza cratere troppo strong (vedere questa domanda come punto di partenza). Questo verrà mappato a "normale SSL", che ha due vantaggi:
- I browser esistenti lo supportano.
- Quando il server presenta un certificato, per quanto falso, è quindi permesso chiedere, in cambio, un certificato client , ottenendo il tipo di autenticazione che stai cercando. E i browser Web fanno supportano i certificati client per SSL.
Si noti che il certificato autofirmato contiene la chiave pubblica del server. Sebbene questa chiave pubblica non venga convalidata, sarà comunque utilizzata per alimentare lo scambio di chiavi, quindi è necessario utilizzare un tipo di chiave e una lunghezza appropriati (ad esempio, RSA 2048). In alternativa, utilizzare uno dei pacchetti di crittografia "DHE", nel qual caso la chiave pubblica del server viene utilizzata solo per le firme, non per proteggere effettivamente i dati, quindi ( nel caso specifico ), le sue dimensioni e il segreto diventa insignificante.