我正在尝试为 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 是使用任何 keystore 创建的,但使用了密码:
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]
我做了什么
因为我知道来自 keystore 的密码是绝对正确的,所以我深入研究了源代码,并开始调试。
最后,我发现无论是普通的 ssl.*
还是带前缀的 listeners.https.ssl.*
配置都没有被考虑在内,结果是有目前无法为 Kafka Connect REST API 配置 SSL。
调用顺序是:
- > RestServer.createConnector
- > SSLUtils.createSslContextFactory
- > AbstractConfig.valuesWithPrefixAllOrNothing
最后一个方法是麻烦的原因。
如果我们有 listeners.https.
属性,则无法返回它们,因为它们在第 254 行被过滤掉了(因为 WorkerConfig 不包含带有前缀的属性)。
否则,如果我们有不带前缀的 ssl.
属性,它们也不会返回,因为 values
字段仅包含来自同一 WorkerConfig 的已知属性(values
是 ConfigDef.parse 的结果)。
我是否遗漏了什么,有没有人为 kafka connect rest api 成功配置 SSL?
最佳答案
尝试导出 KAFKA_OPTS=-Djava.security.auth.login.config=/apps/kafka/conf/kafka/kf_jaas.conf
其中 kf_jaas.conf
包含 ZooKeeper客户端认证
关于rest - 无法为 Kafka Connect REST API 配置 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55220602/