Włącz TLS 1.1 i 1.2 dla klientów w Javie 7

50

Java 7 wyłącza TLS 1.1 i 1.2 dla klientów. Z architektury architektury kryptograficznej Java Dokumentacja dostawców Oracle :

Chociaż SunJSSE w wersji Java SE 7 obsługuje TLS 1.1 i TLS 1.2, żadna wersja nie jest domyślnie włączona dla połączeń klienckich. Niektóre serwery nie implementują poprawnie zgodności przesyłania dalej i odmawiają rozmowy z klientami TLS 1.1 lub TLS 1.2. W celu zapewnienia interoperacyjności SunJSSE domyślnie nie włącza TLS 1.1 ani TLS 1.2 dla połączeń klienckich.

Interesuje mnie włączenie protokołów w ustawieniach całego systemu (być może poprzez plik konfiguracyjny), a nie rozwiązanie dla aplikacji Java.

Jak administracyjnie włączyć TLS 1.1 i 1.2 w całym systemie ?

Uwaga : od POODLE chciałbym administracyjnie wyłączyć protokół SSLv3 dla całego systemu . (Problemy z SSLv3 poprzedzają POODLE o co najmniej 15 lat, ale Java / Oracle / Developerzy nie przestrzegali podstawowych najlepszych praktyk, więc użytkownicy tacy jak ty i ja muszą sprzątać bałagan).


Oto wersja 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)
jww
źródło
Jedyną rzeczą, która działała dla mnie, było ustawienie domyślnego tekstu SSLC zgodnie z opisem tutaj: stackoverflow.com/questions/39157422/…
shmert

Odpowiedzi:

31

Możesz po prostu dodać następującą właściwość, -Dhttps.protocols=TLSv1.1,TLSv1.2która konfiguruje JVM w celu określenia, która wersja protokołu TLS powinna być używana podczas połączeń https.

Tomasz Rebizant
źródło
6
Wyjaśnij więcej, na czym to polega. W przeciwnym razie jest to niejasne i potencjalnie szkodliwe w niewłaściwych rękach.
studiohack
1
@Tomasz - Zgadzam się z innymi tutaj ... Jak to zrobić administracyjnie w systemie? Czy zostanie dodany do pliku konfiguracyjnego komputera? Jeśli tak, jaki jest plik i gdzie go dodać?
jww
3
maybye ten link pomoże: blogs.oracle.com/java-platform-group/entry/… możesz dodać właściwość -Dhttps.protocols jako parametr w przykładzie wiersza poleceń: java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 lub gdzieś w plikach konfiguracyjnych aplikacji (serwera). Można sprawdzić, czy działa poprzez dodanie dodatkowych param: -Djavax.net.debug = po tym wszystkim, kiedy negocjacje wola aplikacja Połączenie HTTPS, będzie drukować wszystkie informacje negocjacji, w tym wersji protokołu, które zostały wykorzystane
Tomasz Rebizant
Ten parametr (https.protocols) konfiguruje maszynę wirtualną Java, której wersji protokołu należy użyć podczas połączenia https.
Tomasz Rebizant,
3
@TomaszRebizant, tak, masz rację. Na przykład dodanie export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"w pliku setenv.sh programu Tomcat włącza zarówno TLSv1, jak i TLSv2 dla wszystkich połączeń SSL wykonanych z aplikacji na serwerze aplikacji.
Zaki
14

Możesz spróbować dodać coś takiego do skryptu uruchamiania, zakładając, że 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"

Kilka innych sugestii: https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls

cnst
źródło
gdzie znalazłeś dokumentację tych proroctw, nie widzę nigdzie indziej wspomnianych w dokumentach JAVA7 dla „-Dloyment.security. {ProtocolName} = True / False;”
Uruchom kod
@runcode, nie do końca pewny, ale jest wspomniany w blogu oracle.com, o którym mowa powyżej
cnst
1
@cnst - problem polega na tym, że muszę skontaktować się z każdym programistą każdego oprogramowania Java i powiedzieć im, aby to zrobili. Stąd powód, dla którego chcę to zrobić administracyjnie na moim komputerze.
jww
Nie działało dla mnie.
Sridhar Sarnobat
9

W przypadku Java 7 w systemie Mac OS X przejdź do System Preferences > Java, a Panel sterowania Java zostanie otwarty w osobnym oknie. Następnie przejdź do Advancedkarty i przewiń w dół do Advanced Security Settingssekcji, a następnie zaznacz pola wyboru Use TLS 1.1i Use TLS 1.2.

wprowadź opis zdjęcia tutaj

Spiff
źródło
Dzięki Spiff. Jestem już skonfigurowany do TLS 1.0 i nowszych, jak pokazałeś. Jednak kiedy tworzę SSLSocket(i zakładam, że dzieje się tak w przypadku innych programów Java), TLS 1.0 jest włączony (a TLS 1.1 i 1.2 są dostępne).
jww
3
Możesz to również przetestować w swoim systemie (jeśli jesteś zainteresowany). Pobierz ProtocolTest.java z tego raportu o błędach i uruchom go. Aby skompilować i wykonać, uruchom javac ProtocolTest.java && java ProtocolTestw terminalu. Zobacz, co pojawia się w części Włączone protokoły .
jww
2
Działa to tylko w przypadku klientów i apletów WebStart. Nie wpływa to na serwery aplikacji uruchomione z plikiem wykonywalnym Java.
eckes
8

Niedawno to zbadałem i chcę dodać - to nie będzie działać dla JDK, deploy.properties dotyczy tylko apletów i innych rzeczy działających w środowisku JRE.

w przypadku aplikacji JDK (serwer, który musi się na przykład łączyć z LDAP), serwer jest klientem, ale security. nie działałoby

nie da się tego zmienić, chyba że napiszesz jakiś kod, taki jak SSLContext.getInstance („TLSv1.2”);

shlomicthailand
źródło
4

Wygląda na to, że ustawienia obrazu wdrażania.security. * Działają w przypadku apletów Java i programów Java Web Start działających na pulpicie. Jak wspominają inni, możesz edytować plik depl.properties, aby to określić.

Oto artykuł, który pokazuje, jak użyć zasad grupy do wdrożenia tego samego pliku obrazu wdrażania.properties dla wszystkich użytkowników: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- java-7-update-10-via-gpo.html

Niestety nie ma możliwości włączenia tego dla wszystkich programów Java na komputerze, który bezpośrednio wywołuje java.exe lub javaw.exe. Musisz znaleźć każdy program korzystający z java, znaleźć plik konfiguracyjny, w którym określasz parametry, które mają zostać przekazane do java, i zmienić go.

Dla Tomcat musieliśmy przekazać to tak, że połączenia z innymi serwerami Tomcat używać TLS 1.1+: -Dhttps.protocols=TLSv1.1,TLSv1.2. W systemie Linux można to zrobić przez edycję bin/catalina.shlub tworzenie bin/setenv.sh.

Nie wiem, co trzeba zrobić, aby Tomcat używał tylko TLS 1.2 po stronie serwera. Mamy do czynienia z Apache HTTP.

sjbotha
źródło
1

Jeśli utkniesz w Javie 7, możesz dodać -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2do argumentów JVM.

Pamiętaj, że ma to kilka zastrzeżeń:

Pomimo tych niedociągnięć, myślę, że może to być przydatne, zwłaszcza gdy protokół, który jest zainteresowany wykorzystaniem TLS, ale nie jest HTTPS, np. LDAPS.

[AKTUALIZACJA] W mojej firmie, która obsługuje swoją pulę serwerów w systemie Ubuntu, zdaliśmy sobie sprawę, że nawet aktualizacja 121 OpenJDK 7 nie była wystarczająca do prawidłowego wdrożenia. Zaktualizowaliśmy wszystkie serwery, aby zaktualizować 181, zanim zadziałało.

AbVog
źródło