Настройка SSL клиента Spring Kafka - PullRequest
1 голос
/ 04 февраля 2020

Моя настройка:

  • JDK 11.0.6
  • Spring Boot 2.2.4.RELEASE
  • spring-kafka 2.4.1

Я проверил свое приложение Zookeeper / Kafka / client в PLAINTEXT, все работает нормально. Я также проверил свои хранилища ключей / хранилища доверия с помощью клиентских инструментов Kafka.

Я использую bean-компонент KafkaAdmin для настройки своих тем, похоже, что при SSL-соединении происходит сбой:

@Bean
public KafkaAdmin kafkaAdmin() {
    Map<String, Object> configs = new HashMap<>();
    configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, getKafkaHost());
    configs.put("security.protocol", "SSL");
    configs.put("ssl.key.password", "xxx");
    configs.put("ssl.keystore.location", "/keystore/client.keystore.jks");
    configs.put("ssl.keystore.password", "xxx");
    configs.put("ssl.truststore.location", "/keystore/kafka.truststore.jks");
    configs.put("ssl.truststore.password", "xxx");
    return new KafkaAdmin(configs);
}

мои два JKS-файла находятся в src / main / resources / keystore в моем проекте. /keystore не работает ... кажется, что их подбирают, если я укажу /src/main/resources/keystore/client.keystore.jks ... это сработает в реальном мире? Во время выполнения в автономном коте будет /src/main/resources/keystore?

Насколько я понимаю, пути относительно папки target/classes, нет?

1 Ответ

1 голос
/ 04 февраля 2020

Клиент Kafka или Spring не может разрешить файл .jks, предоставленный непосредственно с путем, даже если вы указали абсолютный путь. Предоставлять относительный путь, например src/main/resources/keystore, не очень хорошая идея, поскольку после сборки содержимое каталога resources будет напрямую скопировано в target/classes, как вы уже знаете.

Итак, свяжите файл напрямую с экземпляром типа org.springframework.core.io.Resource, используя аннотацию значения из classpath.

@Value("classpath:certs/keystore/kafka.keystore.jks")
private Resource keystore;

@Value("classpath:certs/truststore/kafka.truststore.jks")
private Resource truststore;

Затем получите абсолютный путь из этого экземпляра, как этот;

configs.put("ssl.keystore.location", keystore.getFile().getAbsolutePath());
configs.put("ssl.truststore.location", truststore.getFile().getAbsolutePath());

Как видите, файлы Keystore и Truststore должны находиться в classpath. В моем случае они находятся в каталогах src/resources/certs/keystore и src/resources/certs/truststore соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...