Kafka SSL 连接被拒绝:没有更多信息

问题描述 投票:0回答:3

我正在努力在 Kafka 服务器和 Spring(启动)Kafka 客户端之间设置 Kafka SSL。
我有一个使用 SSL 的工作 Kafka 服务器,如下所示:http://kafka.apache.org/documentation/#security_ssl

listeners=SSL://test.test.de:9093
# ssl
security.inter.broker.protocol=SSL
ssl.keystore.location=/home/kafka/ssl/server.keystore.jks
ssl.keystore.password=secret
ssl.key.password=secret
ssl.truststore.location=/home/kafka/ssl/server.truststore.jks
ssl.truststore.password=secret
ssl.client.auth=required
ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1
ssl.keystore.type=JKS
ssl.truststore.type=JKS
ssl.secure.random.implementation=SHA1PRNG

我使用 Spring Kafka 设置了一个 Spring Boot 库应用程序。这些是生产者配置:

Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "test.test.de:9093");
props.put(ProducerConfig.RETRIES_CONFIG, 0);
props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
props.put(ProducerConfig.LINGER_MS_CONFIG, 1);
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL");
props.put("ssl.keystore.location", "C:\\dev\\tmp\\ssl\\client.keystore.jks");
props.put("ssl.truststore.location", "C:\\dev\\tmp\\ssl\\client.truststore.jks");
props.put("ssl.keystore.password", "secret");
props.put("ssl.truststore.password", "secret");
props.put("ssl.key.password", "secret");
props.put("ssl.enabled.protocols", "TLSv1.2,TLSv1.1,TLSv1");
props.put("ssl.keystore.type", "JKS");
props.put("ssl.truststore.type", "JKS");

当我通过

kafkaTemplate.sendDefault
发送消息时,我收到此异常:

java.net.ConnectException: Connection refused: no further information
at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:589) ~[na:na]
at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:839) ~[na:na]
at org.apache.kafka.common.network.SslTransportLayer.finishConnect(SslTransportLayer.java:137) ~[kafka-clients-2.5.0.jar:na]
at org.apache.kafka.common.network.KafkaChannel.finishConnect(KafkaChannel.java:220) ~[kafka-clients-2.5.0.jar:na]
at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:530) ~[kafka-clients-2.5.0.jar:na]
at org.apache.kafka.common.network.Selector.poll(Selector.java:485) ~[kafka-clients-2.5.0.jar:na]
at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:549) ~[kafka-clients-2.5.0.jar:na]
at org.apache.kafka.clients.producer.internals.Sender.runOnce(Sender.java:324) ~[kafka-clients-2.5.0.jar:na]
at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:239) ~[kafka-clients-2.5.0.jar:na]
at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]

编辑:
一些进一步的调试日志:

2020-07-16 13:28:06.204 DEBUG 12516 --- [ad | producer-1] 
org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Node -1 disconnected.
2020-07-16 13:28:06.204  WARN 12516 --- [ad | producer-1] 
org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Connection to node -1 (test.test.de/192.192.192.192:9093) could not be established. Broker may not be available.
2020-07-16 13:28:06.204  WARN 12516 --- [ad | producer-1] 
org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Bootstrap broker test.test.de:9093 (id: -1 rack: null) disconnected
2020-07-16 13:28:06.305 DEBUG 12516 --- [ad | producer-1] 
org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Initialize connection to node test.test.de:9093 (id: -1 rack: null) for sending metadata request
2020-07-16 13:28:06.305 DEBUG 12516 --- [ad | producer-1] 
org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Initiating connection to node test.test.de:9093 (id: -1 rack: null) using address test.test.de/192.192.192.192
2020-07-16 13:28:08.331 DEBUG 12516 --- [ad | producer-1] 
o.apache.kafka.common.network.Selector   : [Producer clientId=producer-1] Connection with test.test.de/192.192.192.192 disconnected

我不知道这是怎么回事。
我在服务器端和客户端都找不到错误详细信息。
我无法评估该错误是否是无效的 SSL 握手或其他原因。

apache-kafka spring-kafka
3个回答
0
投票

我自己刚刚找到了答案。感谢您的帮助。正如 Gary Russell 正确指出的那样,没有 SSL 错误。在我看来,客户端由于某些奇怪的原因无法到达服务器(ping 正常)。

事实证明,在(debian)(kafka)服务器的 /etc/hosts 文件中,test.test.de 的条目设置为 127.0.1.1。我将其更改为当前的 IP 地址,现在可以使用了。 由于我不是系统管理员,我不知道为什么会有这个 IP 设置。现在可以了。


0
投票

我尝试了另一种也有效的解决方案:

  • 离开上面
    /etc/hosts
    127.0.1.1 test.test.de test
  • 将kafka的
    listeners
    中的
    server.config
    设置为
    listeners=SSL://:9093

在 debian 系统上,127.0.1.1 的原因如下:
https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_hostname_resolution
在这里:
http://bugs.debian.org/719621

我有两个选择:

  1. 因此,只要您将其分配给 127.0.1.1,在侦听器配置中使用 dns
    test.test.de
    就不起作用(对于客户端连接)。如果您向 dns
    test.test.de
    提供从任何 dhcp 系统(通常应保持静态)获取的 IP 地址,则侦听器配置正在使用
    listeners=SSL://test.test.de:9093
  2. 如果您在侦听器配置中省略了 host.name 设置,您还可以将 /etc/hosts 中的 dns 设置为 127.0.1.1。

我不知道为什么,但这似乎解决了我使用 ssl 的客户端-服务器 kafka 通信错误。


0
投票

所以我面临着类似的问题。

事实证明,在运行 Kafka 服务器之前,您需要启动 Zookeeper。

所以在不同的终端首先启动Zookeeper

D:\ProgramFiles\kafka> zkserver

然后启动Kafka服务器

D:\ProgramFiles\kafka> .\bin\windows\kafka-server-start.bat .\config\server.properties

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.