KafkaクライアントでSSLを使用するようにSpringBootアプリケーションをセットアップしようとしています。次の理由により、keystore.jksとtruststore.jksをファイルシステム(Dockerコンテナー)に保存しています。 https://github.com/spring-projects/spring-kafka/issues/71
これが私の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をSpringBootに渡す方法がわかりません。
更新2018年6月7日
これは私の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"]
議論によると、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/
誰かがまだこれを見ている場合は、ファイルパスの前にfile://を付けてみてください。
truststorelocation: "file:///tmp/kafka.client.keystore.jks"
エラーはURLの欠如について不平を言っています-プロトコル(file://)を追加すると、パスがURLになります(非常に基本的に言えば)