Inizializzazione SSLContext

Sto guardando la guida di riferimento JSSE , ho bisogno di ottenere un’istanza di SSLContext per creare un SSLEngine , quindi posso usarlo con Netty per abilitare la sicurezza.

Per ottenere un’istanza di SSLContext , utilizzo SSLContext.getInstance() . Vedo che il metodo viene sovrascritto più volte, quindi posso scegliere il protocollo e il provider di sicurezza da utilizzare.

Qui , posso vedere l’elenco di algoritmi che possono essere utilizzati. Quale algoritmo dovrei usare per abilitare la comunicazione sicura?

Inoltre, dato che è ansible specificare il fornitore di sicurezza da utilizzare, quale fornitore dovrei usare?

Grazie

Come puoi vedere nella documentazione dei nomi standard , tutte le voci (SSLv3, TLSv1.0, TLSv1.1, …) dicono che possono supportare altre versioni.

In pratica, in Oracle JDK (e OpenJDK), lo fanno tutti. Se si guarda il codice sorgente , la class TLS10Context è ciò che viene utilizzato per TLS, SSL, SSLv3 e TLS10, TLS11Context viene utilizzato per TLSv1.1 e TLS12Context per TLSv1.2. Tutti supportano tutte le versioni di SSL / TLS, è ciò che è abilitato di default che varia.

Questo potrebbe essere diverso con un altro fornitore o fornitore JRE. Ovviamente dovresti sceglierne uno che supporti almeno la versione del protocollo che desideri utilizzare.

Si noti che il protocollo utilizzato viene determinato in seguito utilizzando SSLSocket.setEnabledProtocols(...) o il SSLEngine equivalente SSLEngine .

Come regola generale, utilizzare il numero di versione più alto che è ansible (SSLv3


Quali protocolli sono abilitati per impostazione predefinita varia a seconda della versione esatta di Oracle JRE.

Quando si guarda il codice sorgente per sun.security.ssl.SunJSSE in OpenJDK 7u40-b43 , TLS è semplicemente un alias per TLSv1 (e lo sono anche SSL e SSLv3 ), in termini di protocolli SSLContext . Osservando le varie implementazioni di SSLContextImpl (che sono le classi interne di SSLContextImpl stesso):

  • Tutti supportano tutti i protocolli.
  • Tutti i protocolli sono abilitati sul lato server per impostazione predefinita.
  • i protocolli lato client abilitati di default variano:
    • TLS10Context (utilizzato per protocollo SSL , SSLv3 , TLS , TLSv1 ) abilita SSLv3 a TLSv1.0 per impostazione predefinita sul lato client.
    • TLS11Context (utilizzato per il protocollo TLSv1.1 ) abilita anche TLSv1.1 per impostazione predefinita.
    • TLS12Context (utilizzato per il protocollo TLSv1.2 ) abilita anche TLSv1.2 per impostazione predefinita.
  • Se FIPS è abilitato, SSL non è supportato (quindi non abilitato per impostazione predefinita).

Questo cambia in Java 8, in congiunzione con la nuova proprietà di sistema jdk.tls.client.protocols .

Di nuovo, quando si guarda il codice sorgente per sun.security.ssl.SunJSSE in OpenJDK 8u40-b25 , i protocolli TLSv1 , TLSv1.1 e TLSv1.2 fanno anche uso di TLS10Context , TLS11Context e TLS12Context , che seguono la stessa logica di in Java 7.

Tuttavia, il protocollo TLS non è più alias di nessuno di essi. Piuttosto, utilizza TLSContext che si basa sui valori nelle proprietà di sistema jdk.tls.client.protocols . Dalla guida di riferimento JSSE :

Per abilitare specifici protocolli SunJSSE sul client, specificarli in un elenco separato da virgole tra virgolette; tutti gli altri protocolli supportati vengono quindi disabilitati sul client. Ad esempio, se il valore di questa proprietà è “TLSv1, TLSv1.1”, le impostazioni del protocollo predefinite sul client per TLSv1 e TLSv1.1 sono abilitate sul client, mentre SSLv3, TLSv1.2 e SSLv2Hello sono disabilitate su il cliente.

Se questa proprietà è vuota, tutti i protocolli sono abilitati di default sia lato client che lato server.

Naturalmente, nelle versioni recenti di Oracle JRE 8, anche SSL è completamente disabilitato per impostazione predefinita (quindi rimosso da tali elenchi).

Si noti che in entrambi i casi (JRE 7 e 8), l’ SSLContext si ottiene per default tramite SSLContext.getDefault() out of the box è più o meno equivalente a un SSLContext ottenuto con il protocollo TLS e inizializzato con i parametri di truststore predefiniti e così via .

Non esiste un valore predefinito per il protocollo, quindi utilizzerei l’ultimo supportato dal tuo JDK, che è TLSv1, TLSv1.1 o TLSv1.2: guarda quale funziona, o dai un’occhiata a getSupportedProtocols() . Il provider di sicurezza predefinito viene utilizzato evitando tutte le API in cui viene specificato, oppure ad es. KeyStore.getDefaultType() .

E quando verrai a prendere le tue SSLEngines, assicurati di utilizzare il metodo che accetta un nome host e una porta. Altrimenti non si otterrà la condivisione della sessione SSL.