Включить TLS 1.1 и 1.2 для клиентов на Java 7

50

Java 7 отключает TLS 1.1 и 1.2 для клиентов. Из архитектуры криптографии Java Документация поставщиков 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)
jww
источник
Единственная вещь, которая работала для меня, была установка стандартного SSLContext, как описано здесь: stackoverflow.com/questions/39157422/…
shmert

Ответы:

31

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

Томаш Ребизант
источник
6
Пожалуйста, объясните больше, что это делает. В противном случае, это расплывчато и может нанести ущерб не в те руки.
studiohack
1
@ Томас - Я вроде как согласен с другими здесь ... Как мне сделать это в административном отношении на уровне всей системы? Это добавлено в файл конфигурации машины? Если это так, что это за файл и куда его добавить?
Jww
3
может, эта ссылка поможет: blogs.oracle.com/java-platform-group/entry/… Вы можете добавить свойство -Dhttps.protocols в качестве параметра в примере командной строки: java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 или где-нибудь в файлах конфигурации приложения (сервера). Вы можете проверить, работает ли он, добавив дополнительный параметр: -Djavax.net.debug = all после этого, когда приложение установит соединение https для согласования, оно напечатает всю информацию о согласовании, включая использованную версию протокола
Tomasz Rebizant
Этот параметр (https.protocols) настраивает виртуальную машину Java, какую версию протокола следует использовать при подключении https.
Томаш Ребизант
3
@ TomaszRebizant, да, ты прав. Например, добавление export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"в Tomcat файла setenv.sh включает оба 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

CNST
источник
Там, где вы нашли документацию по этим свойствам, я не вижу нигде, в которой они упоминают в документации по JAVA7 для "-D deploy.security. {ProtocolName} = True / False;"
код запуска
@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флажки.

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

Spiff
источник
Спасибо, Спифф. Я уже настроен для 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. Это не влияет на серверы приложений, запущенные с исполняемым файлом Java.
eckes
8

Я только недавно исследовал это и хочу добавить - это не будет работать для JDK, deploy.properties, относящихся только к Applets и другим вещам, работающим в JRE.

для приложений JDK (например, сервер, которому необходимо подключиться к LDAP) сервер является клиентом, но развертывание .security. не будет работать.

нет способа изменить его, если вы не напишите некоторый код, такой как SSLContext.getInstance ("TLSv1.2");

shlomicthailand
источник
4

Похоже, что параметры deploy.security. * Работают для программ Java Applets и Java Web Start, работающих на рабочем столе. Как и другие упоминают здесь, вы можете отредактировать развертывание. Свойства, чтобы указать это.

Вот статья, в которой показано, как использовать групповую политику для развертывания одного и того же файла deploy.properties для всех пользователей: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- Java-7-обновление-10-через-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.

sjbotha
источник
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.

[ОБНОВЛЕНИЕ] В моей компании, которая использует свой пул серверов в Ubuntu, мы поняли, что даже обновления 121 OpenJDK 7 было недостаточно для правильной реализации. Мы обновили все серверы до обновления 181, прежде чем он заработал.

AbVog
источник