【问题标题】:Unable to configure SSL for Kafka Connect REST API无法为 Kafka Connect REST API 配置 SSL
【发布时间】:2019-08-08 18:37:58
【问题描述】:

我正在尝试为 Kafka Connect REST API (2.11-2.1.0) 配置 SSL。

问题

我尝试了两种配置(worker config):

  • 带有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.*的配置都没有考虑在内,因此目前无法为Kafka Connect REST API配置SSL。

调用顺序是:

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

最后一个方法是麻烦的原因。

如果我们有listeners.https. 属性,它们将无法返回,因为它们在第 254 行被过滤掉了(因为 WorkerConfig 不包含带有前缀的属性)。

否则,如果我们有无前缀的 ssl. 属性,它们也不会返回,因为 values 字段仅包含来自同一 WorkerConfig 的已知属性(values 是 ConfigDef.parse 的结果)。

我是否遗漏了什么,有人为 kafka connect rest api 成功配置了 SSL 吗?

【问题讨论】:

  • 您是否尝试添加“ssl.endpoint.identification.algorithm=" 保留属性空白。
  • @suraj_fale 当然,但它甚至没有达到证书交换阶段。它在密码协商阶段失败。
  • @Eugene 你有没有得到这个工作?我遇到了同样的问题。
  • @SledgeHammer 没有。但我没有测试较新的版本
  • 从答案中移出 - github.com/sudar-path/kc-rest-mtls

标签: rest ssl apache-kafka apache-kafka-connect


【解决方案1】:

尝试导出KAFKA_OPTS=-Djava.security.auth.login.config=/apps/kafka/conf/kafka/kf_jaas.conf,其中kf_jaas.conf 包含ZooKeeper 客户端身份验证

【讨论】:

  • 感谢您的回答,但这与我的问题无关。我的连接器工作正常,连接到代理没有任何问题。我的目标是保护内置的 Kafka Connect REST API。
【解决方案2】:

我没有测试 Connect REST API,但是 KafkaTemplate 使用 ssl 发送和接收消息。 根据您的配置,我可能会假设两个问题:

  • 您没有指定信任库(用于证书链检查)
  • 您使用了绝对路径,但 spring keystore-location 解释为
    相对于 /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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2018-10-16
    • 2020-10-23
    • 2019-05-31
    • 2017-03-30
    相关资源
    最近更新 更多