Abilitare TLS 1.1 e 1.2 per i client su Java 7


50

Java 7 disabilita TLS 1.1 e 1.2 per i client. Dalla documentazione dei provider Oracle per l'architettura di crittografia Java :

Sebbene SunJSSE nella versione Java SE 7 supporti TLS 1.1 e TLS 1.2, nessuna versione è abilitata per impostazione predefinita per le connessioni client. Alcuni server non implementano correttamente la compatibilità diretta e rifiutano di parlare con i client TLS 1.1 o TLS 1.2. Per l'interoperabilità, SunJSSE non abilita TLS 1.1 o TLS 1.2 per impostazione predefinita per le connessioni client.

Sono interessato ad abilitare i protocolli su un'impostazione a livello di sistema (forse attraverso un file di configurazione) e non una soluzione per applicazione Java.

Come abilitare a livello amministrativo il sistema TLS 1.1 e 1.2 a livello ?

Nota : da POODLE, desidero disabilitare amministrativamente il sistema SSLv3 a livello . (I problemi con SSLv3 precedono POODLE di almeno 15 anni, ma Java / Oracle / Developers non hanno rispettato le migliori pratiche di base, quindi agli utenti come te e me resta il compito di ripulire il casino).


Ecco la versione Java:

$ /Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home/bin/java -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)

L'unica cosa che ha funzionato per me stava tramontando il default SSLContext come descritto qui: stackoverflow.com/questions/39157422/...
shmert

Risposte:


31

È possibile semplicemente aggiungere la seguente proprietà -Dhttps.protocols=TLSv1.1,TLSv1.2che configura la JVM per specificare quale versione del protocollo TLS deve essere utilizzata durante le connessioni https.


6
Per favore, spiega di più di ciò che fa. Altrimenti, questo è vago e potenzialmente dannoso nelle mani sbagliate.
studiohack

1
@Thomasz - Sono un po 'd'accordo con gli altri qui ... Come faccio a livello amministrativo su base di sistema? Viene aggiunto al file di configurazione di una macchina? In tal caso, qual è il file e dove lo aggiungo?
jww,

3
Forse questo link ti aiuterà: blogs.oracle.com/java-platform-group/entry/… puoi aggiungere la proprietà -Dhttps.protocols come parametro nell'esempio della riga di comando: java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 o da qualche parte nei file di configurazione dell'applicazione (server). Puoi verificare se funziona aggiungendo parametri aggiuntivi: -Djavax.net.debug = tutto ciò dopo, quando l'applicazione negozierà la connessione https, stamperà tutte le informazioni di negoziazione, inclusa la versione del protocollo che sono state utilizzate
Tomasz Rebizant

Questo parametro (https.protocols) sta configurando la macchina virtuale Java quale versione del protocollo deve essere utilizzata durante la connessione https.
Tomasz Rebizant,

3
@TomaszRebizant, sì, hai ragione. Ad esempio, l'aggiunta export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"di setenv.sh di Tomcat abilita TLSv1 e TLSv2 per tutte le connessioni SSL effettuate dalle app sul server delle applicazioni.
Zaki,

14

Potresti provare ad aggiungere qualcosa come il seguente al tuo script di avvio, supponendo Java 1.7:

JAVACMD="$JAVACMD -Ddeployment.security.SSLv2Hello=false -Ddeployment.security.SSLv3=false -Ddeployment.security.TLSv1=false -D\ deployment.security.TLSv1.1=true -Ddeployment.security.TLSv1.2=true"

Alcuni altri suggerimenti: https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls


dove hai trovato la documentazione di queste proprietà, non vedo da nessuna parte menzionano nei documenti JAVA7 per "-D deployment.security. {ProtocolName} = True / False;"
ricodificato il

@runcode, non proprio sicuro, ma è menzionato nel blog di oracle.com a cui si fa riferimento sopra
cnst

1
@cnst - il problema qui è che devo contattare tutti gli sviluppatori di ogni pezzo di software Java e dire loro di farlo. Da qui il motivo per cui voglio farlo amministrativamente una volta sulla mia macchina.
jww,

Non ha funzionato per me.
Sridhar Sarnobat,

9

Per Java 7 su Mac OS X, vai su System Preferences > Javae il Pannello di controllo Java si apre in una finestra separata. Quindi vai alla Advancedscheda e scorri verso il basso fino alla Advanced Security Settingssezione e seleziona le caselle di controllo Use TLS 1.1e Use TLS 1.2.

inserisci qui la descrizione dell'immagine


Grazie Spiff. Sono già impostato per TLS 1.0 e versioni successive, come hai dimostrato. Tuttavia, quando creo un SSLSocket(e presumo che ciò accada ad altri programmi Java), TLS 1.0 è abilitato (e TLS 1.1 e 1.2 sono disponibili).
jww

3
Puoi testarlo anche sul tuo sistema (se interessato). Scarica ProtocolTest.java da questa segnalazione di bug ed eseguilo. Per compilare ed eseguire, eseguire javac ProtocolTest.java && java ProtocolTestin un terminale. Guarda cosa appare in Protocolli abilitati .
JWW

2
Funziona solo con client e applet WebStart. Non influisce sui server applicazioni avviati con l'eseguibile java.
Verifica il

8

Ho appena cercato questo e voglio aggiungere - questo non funzionerà per JDK, le proprietà deployment.properties rilevanti solo per le applet e altre cose in esecuzione nel JRE.

per le applicazioni JDK (un server che ad esempio deve connettersi a LDAP) il server è un client ma deploy.security. non funzionerebbe.

nessun modo per cambiarlo se non si scrive un codice come SSLContext.getInstance ("TLSv1.2");


4

Sembra che deployment.security. * Le impostazioni funzionano per i programmi Java Applet e Java Web Start in esecuzione su un desktop. Come altri citano qui, è possibile modificare deployment.properties per specificarlo.

Ecco un articolo che mostra come utilizzare un criterio di gruppo per distribuire lo stesso file deployment.properties per tutti gli utenti: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- java-7-update-10-via-gpo.html

Sfortunatamente non c'è modo di accenderlo per tutti i programmi Java su un computer che chiama direttamente java.exe o javaw.exe. Devi trovare ogni programma che utilizza Java, trovare il file di configurazione in cui si specificano i parametri da passare a Java e modificarlo.

Per Tomcat abbiamo dovuto passare questo in modo che i collegamenti da Tomcat ad altri server utilizzano TLS 1.1+: -Dhttps.protocols=TLSv1.1,TLSv1.2. Su Linux questo può essere fatto modificando bin/catalina.sho creando bin/setenv.sh.

Non so cosa ci vuole per far usare a Tomcat solo TLS 1.2 sul lato server. Facciamo fronte con HTTP Apache.


1

Se sei bloccato con Java 7, puoi aggiungere -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2agli argomenti di JVM.

Si noti che questo ha diversi avvertimenti:

Nonostante queste carenze, penso che ciò potrebbe essere utile, specialmente quando il protocollo a cui si è interessati utilizza TLS ma non è HTTPS, ad esempio LDAPS.

[AGGIORNAMENTO] Nella mia azienda, che gestisce il suo pool di server su Ubuntu, ci siamo resi conto che anche l'aggiornamento 121 di OpenJDK 7 non era sufficiente per implementarlo correttamente. Abbiamo aggiornato tutti i server per aggiornare 181 prima che funzionasse.

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.