【问题标题】:Spring Kafka SSL setup in Spring boot application.ymlSpring 引导 application.yml 中的 Spring Kafka SSL 设置
【发布时间】:2018-12-14 10:55:54
【问题描述】:

我正在尝试使用 Kafka 客户端设置 Spring Boot 应用程序以使用 SSL。 因为这个原因,我将 keystore.jks 和 truststore.jks 存储在文件系统(在 docker 容器上):https://github.com/spring-projects/spring-kafka/issues/710

这是我的 application.yml:

spring:
  kafka:
      ssl:
        key-password: pass
        keystore-location: /tmp/kafka.client.keystore.jks
        keystore-password: pass
        truststore-location: /tmp/kafka.client.truststore.jks
        truststore-password: pass

但是当我启动应用程序(在 docker 容器中)时,它会说:

Caused by: java.lang.IllegalStateException: Resource 'class path resource [tmp/kafka.client.keystore.jks]' must be on a file system
[..]
Caused by: java.io.FileNotFoundException: class path resource [tmp/kafka.client.keystore.jks] cannot be resolved to URL because it does not exist

我检查了容器,.jks 在 /tmp 中。

我无法理解如何将 .jks 传递给 spring boot。

更新 06/07/2018

这是我的 dockerfile

FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY ssl/kafka.client.keystore.jks /tmp
COPY ssl/kafka.client.truststore.jks /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

【问题讨论】:

  • 试试这个格式 keystore-location: ./tmp/kafka.client.keystore.jks 这应该可以工作
  • 如果您有问题@user,请告诉我
  • @Deadpool 对于您建议的格式,用户需要将密钥库和文件挂载到执行目录,父文件夹为 tmp。

标签: java spring docker spring-boot apache-kafka


【解决方案1】:

如果有人还在看这个,请尝试在文件路径前添加 file://:

truststorelocation: "file:///tmp/kafka.client.keystore.jks"

错误是抱怨缺少 URL - 添加协议 (file://) 使路径成为 URL(非常基本)

【讨论】:

  • 这是正确答案。如果属性来自文件,则需要在文件前添加。
【解决方案2】:

根据讨论和启用kafka ssl配置,首先需要在consumerFactory中启用和设置ssl属性

@Bean
public ConsumerFactory<String, ReportingTask> consumerFactory() {
    Map<String, Object> props = new HashMap<>();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
    props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonSerializable.class);
    props.put(ConsumerConfig.CLIENT_ID_CONFIG, clientId);
    props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, enableAutoCommit);
    props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitInterval);
    props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, sessionTimeout);
    props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, maxRecords);
    props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, offSet);
    if (sslEnabled) {
        props.put("security.protocol", "SSL");
        props.put("ssl.truststore.location", trustStoreLocation);
        props.put("ssl.truststore.password", trustStorePassword);

        props.put("ssl.key.password", keyStorePassword);
        props.put("ssl.keystore.password", keyStorePassword);
        props.put("ssl.keystore.location", keyStoreLocation);
    }
    return new DefaultKafkaConsumerFactory<>(props, new StringDeserializer(), new JsonDeserializer<>(Task.class));
}

并将证书复制到 docker 容器中

COPY ssl/stage/* /var/lib/kafka/stage/

【讨论】:

  • 它不起作用。我的原因是:java.io.FileNotFoundException:类路径资源 [tmp/kafka.client.keystore.jks] 无法解析为 URL,因为它不存在
  • 我删除了这两行并更改了我的 application.yml ,就像你说的那样,但我一直遇到同样的异常。 @死侍
  • 这里的if条件是什么sslEnabled?
  • 如果您想为 kafka 启用 ssl,您可以拥有自己的自定义属性。
猜你喜欢
  • 2020-05-19
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 2022-12-06
  • 2021-09-28
  • 1970-01-01
相关资源
最近更新 更多