【发布时间】: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。
调用顺序是:
- RestServer.createConnector
- SSLUtils.createSslContextFactory
- 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