Плагины и утилиты для EVTA#
VaultSslContextBuilderPlugin#
Описание плагина#
Плагин позволяет формировать SSLContext из хранилищ на файловой системе или HashiCorp Vault. Так же поддерживается расширение kafka-client для интеграции с HashiCorp Vault.
Подключение#
Добавить актуальную версию плагина в зависимости проекта.
Использовать необходимые классы для построения SSLContext.
Построение контекста из хранилищ из файлов#
Используется класс ru.sbt.ss.ssl.context.builder.SSLContextBuilder:
SSLContext context = SSLContextBuilder.builder()
.withProtocol("TLSv1.2")
.withConscrypt()
.withKeyPassword("123".toCharArray())
.withKeyStorePassword("456".toCharArray())
.withTrustStorePassword("456".toCharArray())
.withStoreType("JKS")
.withKeyStoreLocation(storeLocation)
.withTrustStoreLocation(storeLocation)
.withDnList("CN=test,OU=FPSS,O=SBT,ST=Moscow,C=RU")
.withEndpointVerificationAlgorithm("dn")
.build();
Параметры SSLContextBuilder#
Имя |
Описание |
Значение по умолчанию |
|---|---|---|
|
Пароль от ключа |
|
|
Расположение хранилища сертификатов |
|
|
Пароль от хранилища сертификатов |
|
|
Тип хранилища сертификатов |
JKS |
|
Расположение хранилища доверенных сертификатов |
|
|
Пароль от хранилища доверенных сертификатов |
|
|
Тип хранилища доверенных сертификатов |
JKS |
|
Версия протокола TLS |
TLSv1.2 |
|
Алгоритм проверки хоста подключения |
|
|
Использование библиотеки Conscrypt |
|
|
Белый список доверенных DN |
|
|
Путь до файла с белым списком доверенных сертификатов |
|
|
Класс для расшифровки паролей |
|
|
Ключ для расшифровки паролей конфигурации |
|
|
Расположение сертификата, полученного из Vault |
|
|
Расположение приватного ключа сертификата, полученного из Vault |
|
|
Расположение файла с доверенными сертификатами, полученными из Vault |
|
|
Позволяет использовать билдер без параметров ssl.truststore.* |
|
|
Признак формирования SSLContext только с использованием хранилища доверенных сертификатов |
|
Построение контекста из HashiCorp Vault#
Используется класс ru.sbt.ss.ssl.context.builder.VaultContextBuilder:
// SSLContext для подключения к Vault
SSLContextBuilder builder = SSLContextBuilder.builder()
.withTrustStoreLocation("/Users/sbt-navalikhin-an/workspace/apps/vault/vaultclient.jks")
.withTrustStorePassword("qwe123".toCharArray())
.withProtocol("TLSv1.2");
SSLContext context = VaultContextBuilder.builder()
.withVaultSSLContextBuilder(builder)
.withAuth(new PasswordAuth("test", "qwe123".toCharArray(), "userpass"))
.withKeyStoreLocation("client.jks")
.withKeyAlias("test-1")
.withTrustStoreLocation("client.jks")
.withVaultAddress("https://vault:8200/")
.withCommonName("TestCert")
.withAltNames(Collections.singletonList("localhost"))
.withIpSans(Collections.singletonList("{ IP_ADDRESS }"))
.withSecretPath("kv1/certstore")
.withKeySecret("key")
.withKeyStoreSecret("keystore")
.withTrustStoreSecret("truststore")
.withIssueRoleName("test1")
.withEngineVersion(1)
.withProtocol("TLSv1.2").build();
Получение сертификатов из консоли#
Скачать
ssl-context-builder-*.jar.Создать файл vault.properties с параметрами подключения к HashiCorp Vault.
Выполнить команду:
java -jar ssl-context-builder-*.jar vault.propertiesСертификаты будут расположены в хранилищах из параметров
ssl.keystore.locationиssl.truststore.location.
Параметры VaultContextBuilder#
Параметры подключения и авторизации в Hashicorp Vault#
Имя |
Описание |
Значение по умолчанию |
|---|---|---|
|
Адрес подключения к Vault, обязательный параметр |
|
|
Тип алгоритма аутентификации в Vault: approle, token, password, certificate, kubernetes |
approle |
|
Путь до API аутентификации в Vault |
|
|
Идентификатор роли приложения при |
|
|
Секрет роли приложения при |
|
|
Токен для подключения к Vault при |
|
|
Имя пользователя для подключения к Vault при |
|
|
Пароль пользователя для подключения к Vault при |
|
|
Роль для подключения к Vault при |
|
|
Service account jwt для подключения к Vault при |
|
|
Провайдер для подключения к Vault при |
kubernetes |
|
Включение протокола TLS при подключении к Vault |
|
|
Параметры для создания SSLContext при подключении по HTTPS к Vault |
|
|
Пространство имен в Vault |
|
|
Версия Key-Value хранилища секретов |
2 |
|
Путь до API движка Key-Value хранилища секретов (обязательно при ssl.vault.engine.version: 2) |
|
|
Количество попыток подключения к Vault |
5 |
|
Интервал между попыток подключения к Vault в миллисекундах |
500 |
|
Тайм-аут запроса к Vault в секундах |
3 |
Настройка версии KV хранилища для хранения секретов#
Выбор версии KV движка настраивается параметром ssl.vault.engine.version в файле vars.yml в блоке vault_configs_file. Реализована возможность подключения engine KV Version 1, KV Version 2.
Пример:
vault_configs_file:
...
ssl.vault.engine.version: 2 # Версия API для key-value машины
ssl.vault.kv.mount.path: kv2 # Путь до API движка Key-Value хранилища секретов (обязательно при ssl.vault.engine.version: 2)
...
Общие параметры, применимые при использовании любого типа хранилищ сертификатов и режима получения клиентского сертификата#
Имя |
Описание |
Значение по умолчанию |
|---|---|---|
|
Добавление в доверенные сертификаты цепочки vault CA (pki/ca_chain) |
|
|
Принудительное получение доверенных сертификатов и перезапись truststore при каждом запуске |
|
|
Версия протокола TLS |
TLSv1.2 |
|
Алгоритм проверки хоста подключения |
|
|
Использование библиотеки Conscrypt |
|
|
Белый список доверенных DN |
|
|
Путь до файла с белым списком доверенных сертификатов |
|
|
Класс для расшифровки паролей |
|
|
Ключ для расшифровки паролей конфигурации |
|
|
Путь до Key-Value секрета с пароля для хранилищ сертификатов |
|
|
Имя поля с паролем от ключа |
|
|
Имя поля с паролем от хранилища сертификатов |
|
|
Имя поля с паролем от хранилища сертификатов |
|
|
Путь до API движка выпуска сертификатов в Vault, также используется для получения цепочки доверенных сертификатов |
pki |
|
Путь до API получения цепочки доверенных сертификатов в vault, по умолчанию |
|
|
Путь до Key-Value секрета c доверенными сертификатами в формате PEM |
|
|
При значении |
|
|
Проверка атрибута |
|
|
Список ключей в секрете, содержимое которых необходимо загрузить в хранилище доверенных сертификатов, разделитель запятая. По умолчанию список пустой и используются все ключи из секрета |
|
|
Промежуток времени до истечения сертификата для его перевыпуска в формате |
PT0S |
|
Префикс идентификатора сертификата CA Vault – при нескольких сертификатах идентификатор будет формироваться объединением префикса и номера сертификата в цепочке |
ca |
|
Идентификатор ключа и сертификата, выпущенных Vault |
key |
Параметры хранения сертификатов в JKS хранилищах#
Имя |
Описание |
Значение по умолчанию |
|---|---|---|
|
Тип хранилища сертификатов, полученных из Vault: jks |
JKS |
|
Расположение хранилища сертификатов, полученных из Vault |
|
|
Права доступа к файлу хранилища сертификатов в POSIX формате, «644» или «w-r–r–» |
600 |
|
Тип хранилища доверенных сертификатов, полученных из Vault: jks |
JKS |
|
Расположение хранилища доверенных сертификатов, полученных из Vault |
|
|
Права доступа к файлу хранилища доверенных сертификатов в POSIX формате, «644» или «w-r–r–» |
600 |
Параметры хранения сертификатов в формате PEM#
Имя |
Описание |
Значение по умолчанию |
|---|---|---|
|
Тип хранилища сертификатов, полученных из Vault: pem |
JKS |
|
Расположение приватного ключа сертификата, полученного из Vault |
|
|
Права доступа к файлу приватного ключа сертификата в POSIX формате, «644» или «w-r–r–» |
600 |
|
Расположение сертификата, полученного из Vault |
|
|
Права доступа к файлу сертификата в POSIX формате, «644» или «w-r–r–» |
600 |
|
Тип хранилища доверенных сертификатов, полученных из Vault: pem |
JKS |
|
Расположение файла с доверенными сертификатами, полученными из Vault |
|
|
Права доступа к файлу с доверенными сертификатами в POSIX формате, «644» или «w-r–r–» |
600 |
Параметры выпуска сертификата через PKI Engine HashiCorp Vault#
Имя |
Описание |
Значение по умолчанию |
|---|---|---|
|
Режим выпуска сертификатов: pki |
pki |
|
Метод выпуска сертификатов, |
issue |
|
Имя роли в движке выпуска сертификатов в Vault, обязательный параметр |
|
|
Значение поля CN в выпускаемом сертификате |
|
|
Электронный адрес владельца сертификата, задается при использовании Secret Manager |
|
|
Список хостов через запятую для поля SAN сертификата |
|
|
Список IP адресов через запятую для поля SAN сертификата |
|
|
Параметр TTL для выпускаемого сертификата |
|
|
Запрос на сертификат в формате PEM |
|
|
Путь до файла с запросом на выпуск нового сертификата |
|
|
Признак формирования SSLContext только с использованием хранилища доверенных сертификатов |
|
|
Максимальное время ожидания момента валидности полученного сертификата в миллисекундах |
10000 |
|
Включение проверки попадания сертификата в список отозванных. Настройка устарела, в качестве замены использовать настройку |
|
|
Список альтернативных имен объектов URI через запятую для поля SAN сертификата |
|
|
Список или фрагмент строки JSON пользовательских OID/UTF8-строк для поля SAN сертификата |
|
|
Поле «Не после» сертификата указанное значение даты, формат значения должен быть указан в формате |
|
|
Если значение true, указанное common_name не будет включено в альтернативные имена DNS или темы электронной почты |
|
|
Включение проверки отзыва сертификата |
|
|
Включение проверки попадания сертификата в список отозванных по CRL перед проверкой по OCSP. По-умолчанию проверка проводится с помощью CRL, затем, в случае неудачи, с помощью OCSP |
|
|
Включение резервной проверки, если первая проверка завершилась ошибкой |
|
|
При наличии сетевых проблем с проверкой по OCSP и CRL, проверка отзыва не выполняется |
|
Параметры получения клиентского сертификата из секрета KV Engine HashiCorp Vault#
Имя |
Описание |
|---|---|
|
Режим выпуска сертификатов: со значением |
|
Ключ сертификата в секрете |
|
Ключ приватного ключа в секрете |
|
Путь до секрета |
|
Игнорирование параметров pem (по умолчанию |
Любые настройки можно загрузить из файла (в данном примере config/vault.properties):
# 1) Путь до файла с параметрами
ssl.vault.properties.file = config/vault.properties
# 2) ОПЦИОНАЛЬНО Переопределить любые настройки, загруженные из файла конфигурации
# Common name сертификата (CN)
ssl.vault.pki.common.name = OVERRIDE-TEST
# Пути до хранилищ сертификатов, сгенерированных vault
ssl.keystore.location = override-vault-keystore.jks
ssl.truststore.location = override-vault-truststore.jks
Настройка функций обратного вызова (callback) метода verify() класса ru.sbt.ss.ssl.conscrypt.DnConscryptHostnameVerifier проверки DN сертификатов#
Для настройки сallback’ов необходимо:
Реализовать интерфейс
ru.sbt.ss.ssl.conscrypt.VerifyCallbackПри помощи библиотеки
"ssl-context-builder"(версии 1.9.4+) полученияSSLContext’а передать реализацию как параметр методаwithDnVerifyCallback()при созданииSSLContext’а с помощью классаru.sbt.ss.ssl.context.builder.SSLContextBuilder.
SSLContext context = SSLContextBuilder.builder().withProperties(properties.asJava).withDnVerifyCallback(new CustomVerifyCallback()).build()
public class CustomVerifyCallback implements VerifyCallback {
@Override
public void onSuccess(X509Certificate cert, String address) {
System.out.println("Call \"onSuccess\" method");
}
@Override
public void onError(X509Certificate cert, String address, Throwable cause) {
System.out.println("Call \"onError\" method");
}
}
Загрузка ключей из Vault#
Для загрузки ключей из vault можно использовать VaultContextBuilder.
Пример настроек необходимых для загрузки ключей:
encryption.service.key.store.type = vault
ssl.vault.address = https://{ IP_ADDRESS }
ssl.vault.auth.role.id = role_id
ssl.vault.auth.secret.id = secret_key
ssl.vault.secret.path = test/encryptions/keys
ssl.vault.tls.enable = true
ssl.vault.tls.truststore.location = /vault.jks
ssl.vault.tls.truststore.password = password
, где: ssl.vault.secret.path – путь, откуда будет выполнена загрузка всех ключей.
Пример загрузки ключей:
Map<String, String> keys = VaultContextBuilder.builder().withProperties(proprties).buildSecretLoader();
Использование движка SberCA#
Движок SberCA аналогичен стандартному движку pki, но в дополнение к стандартному запросу issue предоставляет запрос fetch.
Разница между методами в том, что issue всегда выпускает новый сертификат, а fetch выпускает новый сертификат только если сертификат не существует или истек. Во всем остальном запросы и настройки идентичны.
Для использования метода fetch используется настройка ssl.vault.pki.method=fetch.
При использовании метода fetch:
при каждом запуске приложения сертификат запрашивается из vault запросом
SberCA/fetch;при наличии локального кеша полученный сертификат сравнивается сертификатом в локальном кеше, используя
fingerprint– по умолчанию SHA-256 хеш от сертификата;если
fingerprintполученного сертификата отличается от сертификата в локальном кеше – сертификат перезаписывается.