DN-endpoint-verifier#
Предусловия#
Поддерживаются клиенты Kafka и Artemis
Последовательность выполнения#
Клиентский плагин, позволяющий валидировать DN брокера при подключении.
Если в конфигурации клиента присутствует настройка ssl.endpoint.identification.algorithm, то плагин заменяет стандартный TrustManager на реализацию Conscrypt и добавляет новый алгоритм идентификации Endpoint — dn(проверкa DN-сертификата брокера по белому списку).
Белый список DN-сертификатов можно задать строкой или отдельным файлом.
Подключение#
Добавить актуальную версию плагина в зависимости проекта.
Настроить клиент в соответствии с примерами ниже.
Дополнительные настройки доступны в виде констант в классе ru.sbt.ss.ssl.common.ExtendedSslConfig.
Настройка Kafka-клиентов#
Плагин подключается с помощью настраиваемой фабрики SslEngineFactory, добавляющей новый параметр для ssl.endpoint.identification.algorithm — dn.
Если не использовать новый алгоритм — функциональность аналогична стандартной 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.