Aktivieren Sie TLS 1.1 und 1.2 für Clients unter Java 7

50

Java 7 deaktiviert TLS 1.1 und 1.2 für Clients. Aus der Java Cryptography Architecture Oracle Providers-Dokumentation :

Obwohl SunJSSE in Java SE 7 TLS 1.1 und TLS 1.2 unterstützt, ist keine der Versionen standardmäßig für Clientverbindungen aktiviert. Einige Server implementieren die Vorwärtskompatibilität nicht ordnungsgemäß und lehnen die Kommunikation mit TLS 1.1- oder TLS 1.2-Clients ab. Aus Gründen der Interoperabilität aktiviert SunJSSE TLS 1.1 oder TLS 1.2 nicht standardmäßig für Clientverbindungen.

Ich bin daran interessiert, die Protokolle auf einer systemweiten Einstellung (möglicherweise über eine Konfigurationsdatei) und nicht auf einer Java-Anwendungslösung zu aktivieren.

Wie kann ich TLS 1.1 und 1.2 systemweit administrativ aktivieren ?

Hinweis : Seit POODLE möchte ichSSLv3 systemweit administrativ deaktivieren . (Die Probleme mit SSLv3 sind mindestens 15 Jahre älter als POODLE, aber Java / Oracle / Developers haben die grundlegenden Best Practices nicht beachtet, sodass Benutzer wie Sie und ich das Chaos aufräumen müssen.)


Hier ist die Java-Version:

$ /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)
jww
quelle
Das einzige, was für mich funktionierte, war das Festlegen des Standard-SSLContexts wie hier beschrieben: stackoverflow.com/questions/39157422/…
shmert

Antworten:

31

Sie können einfach die folgende Eigenschaft hinzufügen, mit der -Dhttps.protocols=TLSv1.1,TLSv1.2die JVM konfiguriert wird, um anzugeben, welche TLS-Protokollversion bei https-Verbindungen verwendet werden soll.

Tomasz Rebizant
quelle
6
Bitte erläutern Sie mehr darüber. Andernfalls ist dies vage und möglicherweise schädlich für die falschen Hände.
studiohack
1
@Thomasz - Ich bin einverstanden mit anderen hier ... Wie mache ich das administrativ auf einer systemweiten Basis? Wird es zur Konfigurationsdatei eines Computers hinzugefügt? Wenn ja, was ist die Datei und wo füge ich sie hinzu?
Jww
3
Möglicherweise hilft dieser Link: blogs.oracle.com/java-platform-group/entry/… Sie können die Eigenschaft -Dhttps.protocols als Parameter im Befehlszeilenbeispiel hinzufügen: java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 oder irgendwo in den Konfigurationsdateien der Anwendung (Server). Sie können überprüfen, ob dies funktioniert, indem Sie den folgenden zusätzlichen Parameter hinzufügen: -Djavax.net.debug = all. Wenn die Anwendung die https-Verbindung aushandelt, werden alle Aushandlungsinformationen gedruckt, einschließlich der Protokollversion, die verwendet wurde
Tomasz Rebizant,
Dieser Parameter (https.protocols) konfiguriert die Java Virtual Machine, welche Protokollversion während der https-Verbindung verwendet werden soll.
Tomasz Rebizant
3
@TomaszRebizant, ja, du hast recht. Wenn Sie beispielsweise export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"in Tomcat setenv.sh hinzufügen, werden TLSv1 und TLSv2 für alle SSL-Verbindungen aktiviert, die über Apps auf dem Anwendungsserver hergestellt werden.
Zaki
14

Sie könnten versuchen, Ihrem Startskript unter der Annahme von Java 1.7 Folgendes hinzuzufügen:

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"

Einige andere Vorschläge: https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls

cnst
quelle
Wo Sie diese Eigenschaftendokumentation gefunden haben, wird in JAVA7-Dokumenten nirgends erwähnt, was "-D deployment.security. {ProtocolName} = True / False;"
Runcode
@runcode, nicht ganz sicher, aber es ist in dem oracle.com Blog erwähnt , die oben verwiesen wird
CNST
1
@cnst - das Problem hierbei ist, dass ich jeden Entwickler jeder Java-Software kontaktieren muss, um ihn dazu aufzufordern. Daher möchte ich es auch einmal administrativ auf meinem Rechner machen.
Jww
Hat bei mir nicht funktioniert.
Sridhar Sarnobat
9

Für Java 7 unter Mac OS X wechseln Sie zu System Preferences > Javaund die Java-Systemsteuerung wird in einem separaten Fenster geöffnet. Dann gehen Sie zu der AdvancedRegisterkarte und scrollen Sie nach unten zu dem Advanced Security SettingsAbschnitt und aktivieren Sie die Kontrollkästchen Use TLS 1.1und Use TLS 1.2.

Bildbeschreibung hier eingeben

Spiff
quelle
Vielen Dank, Spiff. Ich bin bereits für TLS 1.0 und höher eingerichtet, wie Sie gezeigt haben. Wenn ich jedoch eine erstelle SSLSocket(und ich gehe davon aus, dass dies bei anderen Java-Programmen der Fall ist), ist TLS 1.0 aktiviert (und TLS 1.1 und 1.2 sind verfügbar).
Jww
3
Sie können dies auch auf Ihrem System testen (falls interessiert). Laden Sie ProtocolTest.java aus diesem Fehlerbericht herunter und führen Sie ihn aus. Zum Kompilieren und Ausführen javac ProtocolTest.java && java ProtocolTestin einem Terminal ausführen . Sehen Sie, was unter Aktivierte Protokolle angezeigt wird .
Jww
2
Dies funktioniert nur für WebStart-Clients und -Applets. Es wirkt sich nicht auf Anwendungsserver aus, die mit der ausführbaren Java-Datei gestartet wurden.
Eckes
8

Ich habe dies erst kürzlich recherchiert und möchte hinzufügen, dass dies nicht für JDK funktioniert.

Für JDK-Anwendungen (ein Server, der zum Beispiel eine Verbindung zu LDAP herstellen muss) ist der Server ein Client, aber die deployment.security. würde nicht funktionieren.

Sie können es nur ändern, wenn Sie Code wie SSLContext.getInstance ("TLSv1.2") schreiben.

shlomicthailand
quelle
4

Es sieht aus wie "deployment.security. *" - Einstellungen funktionieren für Java Applets und Java Web Start-Programme, die auf einem Desktop ausgeführt werden. Wie andere hier erwähnen, können Sie deployment.properties bearbeiten, um dies anzugeben.

In diesem Artikel wird beschrieben, wie mithilfe einer Gruppenrichtlinie dieselbe Datei "deployment.properties" für alle Benutzer bereitgestellt wird: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- Java-7-Update-10-via-gpo.html

Leider gibt es keine Möglichkeit, dies für alle Java-Programme auf einem Computer zu aktivieren, der direkt java.exe oder javaw.exe aufruft. Sie müssen jedes Programm finden, das Java verwendet, die Konfigurationsdatei finden, in der Sie die Parameter angeben, die an Java übergeben werden sollen, und sie ändern.

Für Tomcat hatten wir dies so passieren , dass Verbindungen von Tomcat auf andere Server TLS verwenden 1.1+: -Dhttps.protocols=TLSv1.1,TLSv1.2. Unter Linux kann dies durch Bearbeiten bin/catalina.shoder Erstellen erfolgen bin/setenv.sh.

Ich weiß nicht, was erforderlich ist, damit Tomcat auf der Serverseite nur TLS 1.2 verwendet. Wir setzen uns mit Apache HTTP auseinander.

sjbotha
quelle
1

Wenn Sie mit Java 7 nicht weiterkommen, können Sie -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2die Argumente der JVM ergänzen .

Beachten Sie, dass dies mehrere Einschränkungen hat:

Trotz dieser Mängel denke ich, dass dies nützlich sein könnte, insbesondere wenn das Protokoll, an dem man interessiert ist, TLS verwendet, aber nicht HTTPS ist, z. B. LDAPS.

[UPDATE] In meiner Firma, die ihren Serverpool unter Ubuntu betreibt, haben wir festgestellt, dass selbst das Update 121 von OpenJDK 7 nicht ausreichte, um dies korrekt zu implementieren. Wir haben alle Server auf das Update 181 aktualisiert, bevor es funktioniert hat.

AbVog
quelle