VaultSslContextBuilderPlugin#

Плагин позволяет получать сертификаты из HashiCorp Vault или из хранилищ на файловой системе и формировать ssl-контекст. Так же поддерживается расширение клиента kafka для интеграции с HashiCorp Vault.

Подключение#

  1. Добавить актуальную версию плагина в зависимости проекта.

  2. Использовать необходимые классы для построения 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#

Имя

Описание

Значение по умолчанию

ssl.key.password

Пароль от ключа

ssl.keystore.location

Расположение хранилища сертификатов

ssl.keystore.password

Пароль от хранилища сертификатов

ssl.keystore.type

Тип хранилища сертификатов

JKS

ssl.truststore.location

Расположение хранилища доверенных сертификатов

ssl.truststore.password

Пароль от хранилища доверенных сертификатов

ssl.truststore.type

Тип хранилища доверенных сертификатов

JKS

ssl.protocol

Версия протокола TLS

TLSv1.2

ssl.endpoint.identification.algorithm

Алгоритм проверки хоста подключения

https

ssl.conscrypt

Использование библиотеки Conscrypt

false

ssl.allowed.dn

Белый список доверенных DN

ssl.allowed.dn.file

Путь до файла с белым списком доверенных сертификатов

security.encoding.class

Класс для расшифровки паролей

ru.sbt.ss.password.BaseEncryptor

security.encoding.key

Ключ для расшифровки паролей конфигурации

ssl.keystore.certificate.chain.location

Расположение сертификата, полученного из Vault

ssl.keystore.key.location

Расположение приватного ключа сертификата, полученного из Vault

ssl.truststore.certificates.location

Расположение файла с доверенными сертификатами, полученными из Vault

ssl.truststore.empty

Позволяет использовать билдер без параметров ssl.truststore.*

false

Построение контекста из 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("127.0.0.1"))
                .withSecretPath("kv1/certstore")
                .withKeySecret("key")
                .withKeyStoreSecret("keystore")
                .withTrustStoreSecret("truststore")
                .withIssueRoleName("test1")
                .withEngineVersion(1)
                .withProtocol("TLSv1.2").build();

Получение сертификатов из консоли#

  1. Скачать ssl-context-builder-*-fatjar.jar.

  2. Создать файл vault.properties с параметрами подключения к HashiCorp Vault.

  3. Выполнить команду:

java -jar ssl-context-builder-*-fatjar.jar vault.properties
  1. Сертификаты будут расположены в хранилищах из параметров ssl.keystore.location и ssl.truststore.location.

Параметры VaultContextBuilder#

Имя

Описание

Значение по умолчанию

ssl.keystore.location

Расположение хранилища сертификатов, полученных из Vault

ssl.keystore.type

Тип хранилища сертификатов, полученных из Vault

JKS

ssl.keystore.mode

Права доступа к файлу хранилища сертификатов в POSIX формате, "644" или "w-r–r–"

ssl.truststore.location

Расположение хранилища доверенных сертификатов, полученных из Vault

ssl.truststore.type

Тип хранилища доверенных сертификатов, полученных из Vault

JKS

ssl.truststore.mode

Права доступа к файлу хранилища доверенных сертификатов в POSIX формате, "644" или "w-r–r–"

ssl.protocol

Версия протокола TLS

TLSv1.2

ssl.endpoint.identification.algorithm

Алгоритм проверки хоста подключения

https

ssl.conscrypt

Использование библиотеки Conscrypt

false

ssl.allowed.dn

Белый список доверенных DN

ssl.allowed.dn.file

Путь до файла с белым списком доверенных сертификатов

ssl.keystore.certificate.chain.location

Расположение сертификата, полученного из Vault

ssl.keystore.key.location

Расположение приватного ключа сертификата, полученного из Vault

ssl.truststore.certificates.location

Расположение файла с доверенными сертификатами, полученными из Vault

ssl.keystore.certificate.chain.mode

Права доступа к файлу сертификата в POSIX формате, "644" или "w-r–r–"

ssl.keystore.key.mode

Права доступа к файлу приватного ключа сертификата в POSIX формате, "644" или "w-r–r–"

ssl.truststore.certificates.mode

Права доступа к файлу с доверенными сертификатами в POSIX формате, "644" или "w-r–r–"

security.encoding.class

Класс для расшифровки паролей

ru.sbt.ss.password.BaseEncryptor

security.encoding.key

Ключ для расшифровки паролей конфигурации

ssl.vault.address

Адрес подключения к Vault, обязательный параметр

ssl.vault.auth.type

Тип алгоритма аутентификации в Vault: approle, token, password, certificate, kubernetes

approle

ssl.vault.auth.mount

Путь до API аутентификации в Vault

ssl.vault.auth.role.id

Идентификатор роли приложения при ssl.vault.auth.type=approle

ssl.vault.auth.secret.id

Секрет роли приложения при ssl.vault.auth.type=approle

ssl.vault.auth.token

Токен для подключения к Vault при ssl.vault.auth.type=token

ssl.vault.auth.username

Имя пользователя для подключения к Vault при ssl.vault.auth.type=password

ssl.vault.auth.password

Пароль пользователя для подключения к Vault при ssl.vault.auth.type=password

ssl.vault.auth.rolename

Роль для подключения к Vault при ssl.vault.auth.type=kubernetes

ssl.vault.auth.jwt

Service account jwt для подключения к Vault при ssl.vault.auth.type=kubernetes. Значение с префиксом "env:" - будет браться из переменных среды, с префиксом "file:" - будет браться из файла

ssl.vault.tls.enable

Включение протокола TLS при подключении к Vault

true

ssl.vault.tls.<параметр SSLContextBuilder>

Параметры для создания SSLContext при подключении по HTTPS к Vault

ssl.vault.namespace

Пространство имен в Vault

ssl.vault.pki.mode

Режим выпуска сертификатов: pki, kv

pki

ssl.vault.pki.mount

Путь до API движка выпуска сертификатов в Vault

pki

ssl.vault.pki.role.name

Имя роли в движке выпуска сертификатов в Vault, обязательный параметр

ssl.vault.pki.common.name

Значение поля CN в выпускаемом сертификате

ssl.vault.pki.email

Электронный адрес владельца сертификата, задается при использовании Secret Manager

ssl.vault.pki.alt.names

Список хостов через запятую для поля SAN сертификата

ssl.vault.pki.alt.ip

Список IP адресов через запятую для поля SAN сертификата

ssl.vault.pki.ttl

Параметр TTL для выпускаемого сертификата

ssl.vault.pki.csr

Запрос на сертификат в формате PEM

ssl.vault.pki.csr.path

Путь до файла с запросом на выпуск нового сертификата

ssl.vault.pki.trust.only

Признак формирования SSLContext только с использованием хранилища доверенных сертификатов

ssl.vault.pki.max.wait.time

Максимальное время ожидания момента валидности полученного сертификата в миллисекундах

10000

ssl.vault.pki.crl.enable

Включение проверки попадания сертификата в список отозванных

true

ssl.vault.secret.path

Путь до Key-Value секрета с пароля для хранилищ сертификатов ssl.keystore.location и ssl.truststore.location

ssl.vault.secret.key

Имя поля с паролем от ключа

ssl.vault.secret.keystore

Имя поля с паролем от хранилища сертификатов ssl.keystore.location

ssl.vault.secret.truststore

Имя поля с паролем от хранилища сертификатов ssl.truststore.location

ssl.vault.pem.path

Путь до Key-Value c pem сертификатом и приватным ключем для него

ssl.vault.pem.name

Имя поля pem сертификата

ssl.vault.pem.key

Имя поля приватного ключа

ssl.vault.pem.trust.path

Путь до Key-Value секрета c доверенными сертификатами в формате PEM

ssl.vault.pem.trust.aliases

Список ключей в секрете, содержимое которых необходимо загрузить в хранилище доверенных сертификатов, разделитель запятая

ssl.vault.before.expire

Промежуток времени до истечения сертификата для его перевыпуска в формате java.time.Duration

PT0S

ssl.vault.alias.ca

Префикс идентификатора сертификата CA Vault - при нескольких сертификатах идентификатор будет формироваться объединением префикса и номера сертификата в цепочке

ca

ssl.vault.alias.key

Идентификатор ключа и сертификата, выпущенных Vault

key

ssl.vault.engine.version

Версия Key-Value хранилища секретов

2

ssl.vault.retries

Количество попыток подключения к Vault

5

ssl.vault.retry.interval

Интервал между попыток подключения к Vault в миллисекундах

500

ssl.vault.timeout

Таймаут запроса к Vault в секундах

3

Пример конфигурации с загрузкой параметров из файла#

Любые настройки можно загрузить из файла (в данном примере 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