Как принудительно применить определенную версию TLS в Java 16+ без установки глобальных свойств

Я знаю, что конкретная версия TLS может быть реализована с помощью глобального свойства, например:

  • с кодом: System.setProperty("jdk.tls.client.protocols", "TLSv1.2");
  • или из командной строки: java -Djdk.tls.client.protocols=TLSv1.2 ...

Есть ли способ сделать это более тонко, на основе SSL для каждого контекста / движка? Например, что, если я хочу предотвратить использование TLSv1.3 в определенном контексте и разрешить только протоколы до TLSv1.2?

Я думал, что это так:

      import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLEngine;
...
var sslContext = SSLContext.getInstance("TLSv1.2");
var sslEngine = sslContext.createSSLEngine();
...

но мои тесты по-прежнему показывают, что TLSv1.3 ползет в фазе подтверждения SSL. В самом деле, Java 16+ java doc объясняет, что параметр "протокол" гарантирует провайдеру поддержку запрошенной версии TLS, но не обязательно ограничивает провайдера от повышения:

      SSLContext.getProtocol(String protocol);

javadoc:

      protocol – the standard name of the requested protocol. See the SSLContext section in the Java Security Standard Algorithm Names Specification for information about standard protocol names.

PS: Я нашел что-то более близкое к тому, что мне нужно здесь ответить: Будет ли SSLContext.getInstance("TLS") также поддерживать TLSv1.1 и TLSv1.2?

      To use TLSv1.2 try to use below code:
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, null);

Предполагая, что ответ правильный (я думаю, что это не так), однако я хочу инициализировать свой контекст из определенного хранилища доверенных сертификатов и менеджеров хранилища ключей, передача NULL для меня неприемлема.

0 ответов

Другие вопросы по тегам