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.