public class JavaTLSKeyStoreParameter
extends java.lang.Object
implements javax.net.ssl.ManagerFactoryParameters
Класс JavaTLSKeyStoreParameter для управления параметрами KeyStore и пароля к нему. Позволяет задать поведение, нужно ли при создании дефолтного (static) контекста заново загружать контейнеры. JCP-1425: используется в функции создания дефолтного контекста. https://gitlab.cp.ru/java/jcp/-/issues/9 Сделано для android и его "белого" списка TLSContext и Java CSP. См. примеры в ACSPClientApp для android. Важно! Известно, что настройки вида System.setProperty со свойствами типа javax.net.ssl.* (далее, просто System.setProperty) обычно используются для разовой настройки дефолтного (static) контекста SSLContext, который часто используют реализации TLS вроде HttpsURLConnection и т.д. в тех случаях, когда для них не задали явно иной SSLSocketFactory из SSLContext. Такой дефолтный (static) контекст будет создан один раз и далее может быть использован. Что такое дефолтный (static) контекст? Это SSL контекст, создаваемый из system-параметров - тех, что задаются в System.setProperty(javax.net.ssl). Если таких параметров нет, то дефолтный (static) контекст использует некие дефолтные значения, например, HDIMAGE для типа хранилища и null для пароля. Важно! В случае, если пароль на контейнер не задан, пароль будет запрошен в окне CSP. Есть несколько способов создать защищенный контекст:
System.setProperty("javax.net.ssl.keyStorePassword", keyPassword); // как минимум, есть этот параметр
System.setProperty("javax.net.ssl.keyStore", keyAlias); // может не быть
Такому дефолтному (static) контексту обычно известно о пароле (как минимум)
и даже об алиасе ключа. Эти настройки задаются разово и распространяются
на весь процесс. Согласно keyPassword начинается перебор всех подходящих
контейнеров, а если задан keyAlias - то еще и по алиасу, что служит
дополнительным фильтром и ощутимо сокращает число отобранных контейнеров,
а также время перебора.
Чем плох способ HttpsURLConnection + динамический контекст?
В случае динамического контекста свойства System.setProperty закономерно
не задаются, они излишни, ведь создан и передан динамический контекст,
однако HttpsURLConnection все же пытается создать дефолтный (static)
контекст, не располагая абсолютно никакими свойствами, что может привести
к неконтролируемому появлению окон ввода пароля, который не был задан
в качестве фильтра для контейнеров.
Поэтому лучше всего избегать использования HttpsURLConnection +
динамический контекст, а лучше и самого HttpsURLConnection!
Вместо него рекомендуется использовать apache http client, ok http и др.
с явным созданием SSLContext без дефолтного (static) контекста и
свойства для него.
Что делать, если HttpsURLConnection все-таки используется/нужен?
В этой ситуации, если создается динамический контекст и не заданы
свойства System.setProperty, использование неполного дефолтного (static)
контекста приведет к появлению окон CSP для ввода пароля для каждого(!)
найденного контейнера, и, чем меньше фильтров в свойствах System.setProperty
(а этих свойств может не быть вообще, если используется динамический
контекст), тем окон больше.
Как убрать окна CSP для ввода пароля, если в HttpsURLConnection
уже был передан динамический контекст?
Для контроля над дефолтным (static) контекстом добавлен параметр:
System.setProperty("disable_default_context", "false");
который задан по умолчанию со значением false.
Свойство disable_default_context определяет, будет ли загружен KeyStore
при создании дефолтного контекста реализациями типа HttpsURLConnection
или нет. По умолчанию оно false, т.е. загрузка KeyStore из дефолтного
контекста включена. KeyStore, если System.setProperty не заданы, пустой.
Чтобы подавить окна в дефолтном (static) контексте, загрузку KeyStore
в нем можно отключить:
System.setProperty("disable_default_context", "true");
ведь уже есть динамический контекст для HttpsURLConnection.
Свойство disable_default_context имеет значение, только если реализация
TLS соединения действительно обращается к дефолтному контексту (ей нужен/не
нужен KeyStore).
ru.CryptoPro.ssl.SSLContextImpl#DISABLE_DEFAULT_CONTEXT
Constructor and Description |
---|
JavaTLSKeyStoreParameter(java.security.KeyStore keyStore,
char[] password,
boolean fromDefaultContext)
Конструктор.
|
Modifier and Type | Method and Description |
---|---|
java.security.KeyStore |
getKeyStore()
Получение ключевого хранилища.
|
char[] |
getPassword()
Получение пароля к ключевому хранилищу.
|
boolean |
isFromDefaultContext()
Проверка, происходит ли инициализация в функции
дефолтного контекста.
|
public JavaTLSKeyStoreParameter(java.security.KeyStore keyStore, char[] password, boolean fromDefaultContext)
keyStore
- Ключевое хранилище.password
- Пароль к ключевому хранилищу.fromDefaultContext
- True, если происходит инициализация
в функции дефолтного контекста.
создаются в функции дефолтного контекста.public java.security.KeyStore getKeyStore()
public char[] getPassword()
public boolean isFromDefaultContext()