Как принудительно применить определенную версию 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 для меня неприемлема.