Невозможно настроить SSL для API REST Kafka Connect - PullRequest
1 голос
/ 18 марта 2019

Я пытаюсь настроить SSL для REST API Kafka Connect (2.11-2.1.0).

Проблема

Я попробовал две конфигурации (рабочий конфиг):

  • с listeners.https. префиксом
listeners=https://localhost:9000
listeners.https.ssl.keystore.location=/mypath/keystore.jks
listeners.https.ssl.keystore.password=mypassword
listeners.https.ssl.key.password=mypassword
  • и без префикса listeners.https.
listeners=https://localhost:9000
ssl.keystore.location=/mypath/keystore.jks
ssl.keystore.password=mypassword
ssl.key.password=mypassword

Обе конфигурации запускаются в порядке и показывают следующее исключение при попытке подключения к https://localhost:9000:

javax.net.ssl.SSLHandshakeException: no cipher suites in common

В журнале я вижу, что SslContextFactory был создан с любым хранилищем ключей, но с шифрами:

210824 ssl.SslContextFactory:350 DEBUG: Selected Protocols [TLSv1.2, TLSv1.1, TLSv1] of [SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2]
210824 ssl.SslContextFactory:351 DEBUG: Selected Ciphers   [TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, ...]
210824 component.AbstractLifeCycle:177 DEBUG: STARTED @10431ms SslContextFactory@42f8285e[provider=null,keyStore=null,trustStore=null]

Что я сделал

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

Наконец, я обнаружил, что ни простые ssl.*, ни префиксные listeners.https.ssl.* конфигурации не принимаются во внимание, и получается, что в настоящее время нет возможности настроить SSL для Kafka Connect REST API.

Последовательность вызовов:

  1. RestServer.createConnector
  2. SSLUtils.createSslContextFactory
  3. AbstractConfig.valuesWithPrefixAllOrNothing

Последний способ является причиной неприятностей.

Если у нас есть listeners.https. свойства, они не могут быть возвращены, потому что они отфильтрованы в строке 254 (поскольку WorkerConfig не содержит свойств с префиксом).

В противном случае, если у нас есть свойства без префикса ssl., они также не возвращаются, поскольку поле values содержит только известные свойства из того же WorkerConfig (values является результатом ConfigDef.parse ).

Я что-то упустил, и кто-нибудь успешно настроил SSL для kafka connect rest api?

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Я не тестировал Connect REST API, но KafkaTemplate отправляет и получает сообщения с помощью ssl.Из вашей конфигурации я могу предположить две проблемы:

  • вы не указали хранилище доверенных сертификатов (для проверки цепочки сертификатов)
  • вы использовали абсолютный путь, но расположение хранилища ключей Spring интерпретируется как
    относительно / webapp

Я пробовал тестовое приложение из примеров: https://memorynotfound.com/spring-kafka-and-spring-boot-configuration-example/ и https://gist.github.com/itzg/e3ebfd7aec220bf0522e23a65b1296c8

Протестировано с использованием Springboot 2.0.4.RELEASE, используется библиотека kafka

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

и это содержимое моего application.properties:

spring.application.name=my-stream-app
spring.kafka.bootstrap-servers=localhost:9093
spring.kafka.ssl.truststore-location=kafka.server.truststore.jks
spring.kafka.ssl.truststore-password=123456 
spring.kafka.ssl.keystore-location=kafka.server.keystore.jks
spring.kafka.ssl.keystore-password=123456 
spring.kafka.ssl.key-password=123456
spring.kafka.properties.security.protocol=SSL

spring.kafka.consumer.group-id=properties test-consumer-group        
app.topic.foo=test 

фрагмент конфигурации сервера kafka:

listeners=SSL://localhost:9093

ssl.truststore.location=/home/legioner/kafka.server.truststore.jks
ssl.truststore.password=123456
ssl.keystore.location=/home/legioner/kafka.server.keystore.jks
ssl.keystore.password=123456
ssl.key.password=123456
0 голосов
/ 18 марта 2019

Попробуйте экспортировать KAFKA_OPTS=-Djava.security.auth.login.config=/apps/kafka/conf/kafka/kf_jaas.conf, где kf_jaas.conf содержит аутентификацию клиента ZooKeeper

...