DN-endpoint-verifier#

Предусловия#

Поддерживаются клиенты Kafka и Artemis

Последовательность выполнения#

Клиентский плагин, позволяющий валидировать DN брокера при подключении.

Если в конфигурации клиента присутствует настройка ssl.endpoint.identification.algorithm, то плагин заменяет стандартный TrustManager на реализацию Conscrypt и добавляет новый алгоритм идентификации Endpointdn(проверкa DN-сертификата брокера по белому списку).

Белый список DN-сертификатов можно задать строкой или отдельным файлом.

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

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

  2. Настроить клиент в соответствии с примерами ниже.

Дополнительные настройки доступны в виде констант в классе ru.sbt.ss.ssl.common.ExtendedSslConfig.

Настройка Kafka-клиентов#

Плагин подключается с помощью настраиваемой фабрики SslEngineFactory, добавляющей новый параметр для ssl.endpoint.identification.algorithmdn. Если не использовать новый алгоритм — функциональность аналогична стандартной org.apache.kafka.common.security.ssl.DefaultSslEngineFactory.

Пример настройки:

# 1. Подключить SslEngineFactory:
ssl.engine.factory.class = ru.sbt.ss.ssl.kafka.DnSslEngineFactory

# 2. Настроить алгоритм идентификации:
ssl.endpoint.identification.algorithm = dn

# 3. Настроить список DN сертфикатов, разрешенных к подключению:
# Строкой:
ssl.allowed.dn = CN=test1; CN=test2,L=RU
# Или c помощью отдельного файла:
ssl.allowed.dn.file = /path/to/allowed-dn.txt

В случае, если проверяемый DN сертификата отсутствует в перечне допустимых DN, в логах появится сообщение "Endpoint(%s)'s DN: \"(%s)\" is not in allowed list.", а клиент через некоторое время может выбросить исключение (зависит от вызываемого метода).

Настройка Artemis-клиентов#

Плагин подключается с помощью настраиваемой фабрики SSLContextFactory, добавляющей новый параметр sslEndpointIdentificationAlgorithm. Если не использовать новый параметр — функциональность аналогична стандартной org.apache.activemq.artemis.core.remoting.impl.ssl.DefaultSSLContextFactory.

При использовании sslEndpointIdentificationAlgorithm параметр verifyHost игнорируется, идентификация Endpoint настраивается аналогично kafka-клиентам:

  • sslEndpointIdentificationAlgorithm = dn — проверка DN сертификата брокера по белому списку;

  • sslEndpointIdentificationAlgorithm = https — проверка соответствия имени хоста и CN/SAN сертификата (стандартный алгоритм, как при verifyHost = true);

  • sslEndpointIdentificationAlgorithm = (пустая строка) — идентификация Endpoint отключена (как при verifyHost = false).

Для подключения SSLContextFactory достаточно добавить плагин в зависимости проекта.

Фабрика подключается с помощью механизма ServiceLoader добавлением файла resources/META-INF/services/org.apache.activemq.artemis.spi.core.remoting.ssl.SSLContextFactory со значением ru.sbt.ss.ssl.artemis.DnSslContextFactory.

Данный файл уже включен в сборку плагина.

Пример настройки:

Map<String, Object> properties = new HashMap<>();

// 1. Настроить алгоритм идентификации:
properties.put("sslEndpointIdentificationAlgorithm", "dn"); // для статичных коннекторов
System.setProperty("org.apache.activemq.ssl.sslEndpointIdentificationAlgorithm", "dn"); // для коннекторов, автоматически загружаемых из топологии кластера

// 2. Настроить список DN сертфикатов, разрешенных к подключению:
// Строкой:
properties.put("sslAllowedDn", "CN=test1; CN=test2,L=RU"); // для статичных коннекторов
System.setProperty("org.apache.activemq.ssl.sslAllowedDn", "CN=test1; CN=test2,L=RU"); // для коннекторов, автоматически загружаемых из топологии кластера

// Или с помощью отдельного файла:
properties.put("sslAllowedDnFile", "/path/to/allowed-dn.txt"); // для статичных коннекторов
System.setProperty("org.apache.activemq.ssl.sslAllowedDnFile", "/path/to/allowed-dn.txt"); // для коннекторов, автоматически загружаемых из топологии кластера

TransportConfiguration configuration = new TransportConfiguration(NettyConnectorFactory.class.getCanonicalName(), properties);

В случае, если проверяемый DN сертификата отсутствует в перечне допустимых DN, будет выброшено исключение org.apache.activemq.artemis.api.core.ActiveMQNotConnectedException с сообщением "Endpoint(%s)'s DN: \"(%s)\" is not in allowed list."

Пример файла со списком разрешенных DN сертификатов:

CN=test_client_1, OU=FPSS, O=SBT, L=MOSCOW, ST=MOSCOW, C=RU
CN=test_client_2, OU=FPSS, O=SBT, L=MOSCOW, ST=MOSCOW, C=RU
CN=test_client_3, OU=FPSS, O=SBT, L=MOSCOW, ST=MOSCOW, C=RU

Результат#

Выполнено подключение плагина DN-endpoint-verifier.