È possibile aggiornare la versione SSL di una connessione solo dal lato server?

2

Sto cercando di scoprire se esiste un modo per aggiornare la versione SSL da SSLv3 a TLSv1 di una connessione, apportando solo modifiche sul lato server.

Nel mio caso, sia l'applicazione client che il server utilizzano OpenSSL (v0.9.8o), quindi entrambi supportano le versioni SSL fino a TLSv1. Ogni volta che il client desidera stabilire una connessione con il server utilizza SSLv3.0 per impostazione predefinita quando avvia l'handshake SSL (ad esempio ClientHello, Versione 3.0) e quindi viene stabilita una connessione con il server utilizzando SSLv3.0.

Modifica: la versione SSL predefinita sull'applicazione client è codificata su SSLv3.0.

Senza apportare modifiche al codice sul lato client, esiste un modo per aggiornare la connessione a TLSv1 apportando solo modifiche al codice sul lato server. Forse utilizzando la rinegoziazione SSL?

Nota: Ovviamente, cambiando la versione predefinita dell'applicazione client in modo che avvenga l'handshake utilizzando TLSv1, viene stabilita una connessione TLSv1, tuttavia, questa non è un'opzione nel mio caso per vari motivi.

Qualsiasi riferimento è molto apprezzato. Grazie per il tuo aiuto.

    
posta jaybird19 16.12.2014 - 17:43
fonte

3 risposte

1

Nell'handshake SSL / TLS, il client invia (come parte della sua ClientHello ) la versione massima che supporta; quindi il server sceglie la versione che verrà utilizzata, che dovrebbe essere la più alta supportata dal server ma non superiore al valore inviato dal client.

  • Se il client invia "SSL 3.0" come la versione supportata più alta, allora il server ha ragione nell'usare SSL 3.0.

  • Se il client supporta SSL 3.0, non otterrai nient'altro che SSL 3.0.

  • La rinegoziazione non cambierà nulla. Una rinegoziazione è semplicemente una nuova stretta di mano. Se il cliente vuole davvero dire "SSL 3.0" nel suo ClientHello , lo dirà ancora e ancora.

  • Se il client supporta effettivamente ulteriori versioni (TLS 1.0 o più) ma non lo dice, quindi:

    1. Il client è bacato o fa cose stupide e dovrebbe essere risolto.
    2. Poiché il client non segue gli standard, è difficile assumere attendibilmente qualsiasi cosa sul suo comportamento.
    3. Tuttavia, è concepibile che se il server risponde con una versione più alta (es. TLS 1.0), il client accetta di usarlo anche se è oltre il valore che il client annunciato .

Se il client usa OpenSSL come libreria condivisa (nota anche come "DLL"), allora potresti avere l'opzione di sostituire quella OpenSSL DLL con un'altra che ignora il numero di versione fornito dal client e invece annuncia ciò che veramente sostiene. Si tratta di un tipo di modifica lato client che non richiede la modifica del codice dell'applicazione client stessa e pertanto può essere applicata anche se il codice sorgente dell'applicazione non è disponibile. È ancora un tremendo trucco.

Una soluzione alternativa sarebbe quella di avvolgere il client all'interno di un qualche tipo di proxy lato client, in pratica eseguendo un Attacco man-in-the-middle .

Se davvero non puoi modificare il client nei modi sopra descritti, allora il meglio che puoi sperare è scegliere (sul server) una suite di crittografia che riduca al minimo le carenze conosciute di SSL 3.0. In particolare, l'applicazione di un codice tramite RC4 eviterà l'attacco di POODLE (ma in RC4 otterrai i pregiudizi noti: scegli il tuo veleno).

    
risposta data 16.12.2014 - 19:12
fonte
1

C'è qualcosa che non va dal lato client.

Il client dovrebbe iniziare la sessione indicando la versione di protocollo più alta che può accettare .

TLS v1 è enumerato come "3.1" per indicare > SSL3:

Since the Version numbers negotiated in the ClientHello and ServerHello messages of SSL are 3.0 and below, version numbers to be negotiated with TLS and future r evisions will continue by negotiating as version 3.1 or higher. This will be done to denote a revision of SSL 3.0, but to promote backwards compatibility between clients and servers using either SSL or TLS.

Source

Ulteriore chiarimento:

Il client DEVE dichiarare la versione più alta che può supportare e il server accetterà, offrirà una versione supportata inferiore o dichiarerà PROTOCOL_VERSION e chiuderà. Da ietf.org :

A TLS server can also receive a ClientHello containing version number smaller than the highest supported version. If the server wishes to negotiate with old clients, it will proceed as appropriate for the highest version supported by the server that is not greater than ClientHello.client_version. For example, if the server supports TLS 1.0, 1.1, and 1.2, and client_version is TLS 1.0, the server will proceed with a TLS 1.0 ServerHello. If server supports (or is willing to use) only versions greater than client_version, it MUST send a "protocol_version" alert message and close the connection.

    
risposta data 16.12.2014 - 18:03
fonte
0

È possibile semplicemente disabilitare il livello inferiore di connessione se non si desidera utilizzarlo. Quando si stabilisce una connessione SSL / TLS, il server consente al client di sapere cosa può supportare e i due capiscono qual è l'opzione migliore.

Se il client supporta TLS e viene forzato in SSL3.0, è probabile che qualcosa vada storto sul client (oppure potrebbe essere un proxy SSL precedente, ad esempio). Qualcosa lungo il percorso non consente di scegliere TLS o le preferenze del client sono impostate in modo molto strano per scegliere una connessione di sicurezza inferiore rispetto a una più sicura.

La soluzione migliore è semplicemente non consentire SSL3.0 se non si desidera che le persone lo utilizzino. È abbastanza facile per un utente malintenzionato forzare un client a un livello inferiore di protocollo se il server lo supporta, quindi l'opzione migliore non è supportarla. Ciò potrebbe significare che alcune persone con browser estremamente obsoleti potrebbero non essere in grado di accedere al tuo sito, ma lasciarlo aperto è potenzialmente compromettente per tutti i tuoi visitatori.

    
risposta data 16.12.2014 - 18:41
fonte

Leggi altre domande sui tag