Увімкніть TLS 1.1 та 1.2 для клієнтів на Java 7


50

Java 7 відключає TLS 1.1 та 1.2 для клієнтів. Від Java Cryptography Architecture Oracle провайдерів документації :

Хоча SunJSSE у випуску Java SE 7 підтримує TLS 1.1 та TLS 1.2, жодна версія не включена за замовчуванням для клієнтських з'єднань. Деякі сервери неправильно реалізують сумісність прямого передавача і відмовляються спілкуватися з клієнтами TLS 1.1 або TLS 1.2. Для інтероперабельності SunJSSE не включає TLS 1.1 або TLS 1.2 за замовчуванням для клієнтських з'єднань.

Мені цікаво включити протоколи в налаштуваннях для всієї системи (можливо, через конфігураційний файл), а не за допомогою Java-рішення.

Як адміністративно включити TLS 1.1 і 1.2 для всієї системи ?

Примітка : оскільки POODLE, я хотів би адміністративно відключити систему SSLv3 вцілому. (Проблеми з SSLv3 передували POODLE щонайменше за 15 років, але Java / Oracle / Developers не дотримувались базових найкращих практик, тому користувачі, як ви, і я, залишаємо прибирання безладу).


Ось версія 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)

Єдине , що працював для мене була установка по замовчуванням SSLContext на , як описано тут: stackoverflow.com/questions/39157422 / ...
shmert

Відповіді:


31

Ви можете просто додати наступне властивість, -Dhttps.protocols=TLSv1.1,TLSv1.2яке налаштовує JVM, щоб вказати, яку версію протоколу TLS слід використовувати під час з'єднань https.


6
Будь-ласка, поясніть більше, що це робить. В іншому випадку це нечітко та потенційно може пошкодити неправильні руки.
studiohack

1
@Thomasz - Я начебто згоден з іншими тут ... Як це зробити адміністративно на загальносистемній основі? Чи додається він до файлу конфігурації машини? Якщо так, що таке файл і куди його додати?
jww

3
maybye, це посилання допоможе: blogs.oracle.com/java-platform-group/entry/… Ви можете додати властивість -Dhttps.protocols як парамуму в прикладі командного рядка: java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 або десь у файлах конфігурації програми (сервера). Ви можете перевірити, чи працює він, додавши додатковий парам: -Djavax.net.debug = все після цього, коли програма переговориме https-з'єднання, вона надрукує всю інформацію про переговори, включаючи використану версію протоколу
Tomasz Rebizant

Цей парам (https.protocols) налаштовує віртуальну машину Java, версію протоколу якої слід використовувати під час з'єднання https.
Tomasz Rebizant

3
@TomaszRebizant, так, ви маєте рацію. Наприклад, додавання export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"в setenv.sh Tomcat дозволяє як TLSv1, так і TLSv2 для всіх SSL-з'єднань, зроблених із додатків на сервері додатків.
Закі

14

Ви можете спробувати додати щось подібне до вашого сценарію запуску, припускаючи 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"

Деякі інші пропозиції: https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls


там, де ви знайшли цю документацію про нерухомість, я не бачу ніде, де вони згадуються в документах JAVA7 для "-D розміщення.безпека. {ProtocolName} = Істинно / Неправдиво;"
runcode

@runcode, не зовсім впевнений, але це згадується в блозі oracle.com, на який посилається вище
cnst

1
@cnst - проблема тут у тому, що мені потрібно звернутися до кожного розробника кожної частини програмного забезпечення Java та сказати їм це зробити. Отже, я хочу зробити це адміністративно один раз на своїй машині.
jww

Не працювало для мене.
Шрідхар Сарнобат

9

Для Java 7 на Mac OS X перейдіть до System Preferences > Java, а панель управління Java відкриється в окремому вікні. Потім ви переходите на Advancedвкладку і прокручуєте вниз до Advanced Security Settingsрозділу, а також встановіть прапорці Use TLS 1.1та Use TLS 1.2прапорці.

введіть тут опис зображення


Спасибі Шпіфе. Я вже налаштований на TLS 1.0 і вище, як ви показали. Однак, коли я створюю SSLSocket(і я припускаю, що це відбувається з іншими програмами Java), TLS 1.0 увімкнено (і TLS 1.1 і 1.2 доступні).
jww

3
Ви можете також протестувати це у вашій системі (якщо вам це цікаво). Завантажте ProtocolTest.java з цього звіту про помилку та виконайте його. Для компіляції та виконання запустіть javac ProtocolTest.java && java ProtocolTestу терміналі. Дивіться, що відображається в розділі Увімкнені протоколи .
jww

2
Це працює лише для клієнтів WebStart та Applets. Це не впливає на сервери додатків, запущені з виконуваним файлом Java.
eckes

8

Нещодавно я це досліджував і хочу додати - це не буде працювати для JDK, розгортання. Властивостей стосується лише Апплетів та інших матеріалів, що працюють у JRE.

для програм JDK (сервера, якому потрібно підключитися до LDAP, наприклад), сервер є клієнтом, але розгортання.безпека. не працювало б.

немає можливості змінити його, якщо ви не введете якийсь код на зразок SSLContext.getInstance ("TLSv1.2");


4

Це виглядає як розгортання.безпека. * Налаштування працюють для програм Java Applets та Java Web Start, які працюють на робочому столі. Як згадують інші, ви можете відредагувати розгортання.

Ось стаття, в якій показано, як використовувати групову політику для розгортання одного і того ж файлу розгортання.properties для всіх користувачів: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- java-7-update-10-via-gpo.html

На жаль, немає можливості увімкнути це для всіх програм Java на комп’ютері, який безпосередньо викликає java.exe або javaw.exe. Ви повинні знайти кожну програму, яка використовує java, знайти файл конфігурації, де ви вказуєте параметри, які потрібно передати java, та змінити його.

Для Tomcat ми повинні були пройти це так , що з'єднання з Tomcat на інші сервера використовувати TLS 1.1+: -Dhttps.protocols=TLSv1.1,TLSv1.2. В Linux це можна зробити за допомогою редагування bin/catalina.shабо створення bin/setenv.sh.

Я не знаю, що потрібно, щоб Tomcat використовував лише TLS 1.2 на стороні сервера. Ми перед фронтом Apache HTTP.


1

Якщо ви застрягли в Java 7, ви можете додати -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2до аргументів JVM.

Зауважте, що це кілька застережень:

  • Це дійсно лише починаючи з оновлення Java 7 95. Довідка: https://blogs.oracle.com/java-platform-group/diagnosing-tls,-ssl,-and-https
  • Це не загальносистемне рішення, навіть якщо воно може бути встановлено в змінній середовища (наприклад, JAVA_OPTS), і в цьому випадку ви залежите від підтримки envvar у своїх додатках Java.

Незважаючи на ці недоліки, я думаю, що це може бути корисним, особливо коли протокол зацікавлений у використанні TLS, але це не HTTPS, наприклад LDAPS.

[UPDATE] У моїй компанії, яка запускає свій пул серверів на Ubuntu, ми зрозуміли, що навіть оновлення 121 OpenJDK 7 було недостатньо для правильної реалізації цього. Ми оновили всі сервери до оновлення 181, перш ніж воно працювало.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.