Kafka returns "No matching PRIVATE KEY entries in PEM file" 尝试开始使用 PEM 证书时

Kafka returns "No matching PRIVATE KEY entries in PEM file" when attempting to start using PEM certificates

首先,我已经看到 但它是无关的并且有不同的问题。

我的 Kafka 属性文件中有以下设置片段:

ssl.keystore.type=PEM
ssl.keystore.key=/path/to/private.key
ssl.keystore.certificate.chain=/path/to/certificate.pem

ssl.truststore.type=PEM
ssl.truststore.certificates=/path/to/ca.pem

ssl.endpoint.identification.algorithm=

请注意,使用 ssl.endpoint.identification.algorithm 是因为集群中的每个服务器都使用单服务器证书,因此我必须以这种方式绕过 SSL 主机名验证。

启动 Kafka 时,我得到以下信息:

org.apache.kafka.common.KafkaException: org.apache.kafka.common.errors.InvalidConfigurationException: Invalid PEM keystore configs
at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:184)
at org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:192)
at org.apache.kafka.common.network.ChannelBuilders.serverChannelBuilder(ChannelBuilders.java:107)
at kafka.network.Processor.<init>(SocketServer.scala:853)
at kafka.network.SocketServer.newProcessor(SocketServer.scala:442)
at kafka.network.SocketServer.$anonfun$addDataPlaneProcessors(SocketServer.scala:299)
at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:190)
at kafka.network.SocketServer.addDataPlaneProcessors(SocketServer.scala:297)
at kafka.network.SocketServer.$anonfun$createDataPlaneAcceptorsAndProcessors(SocketServer.scala:262)
at kafka.network.SocketServer.$anonfun$createDataPlaneAcceptorsAndProcessors$adapted(SocketServer.scala:259)
at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:563)
at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:561)
at scala.collection.AbstractIterable.foreach(Iterable.scala:919)
at kafka.network.SocketServer.createDataPlaneAcceptorsAndProcessors(SocketServer.scala:259)
at kafka.network.SocketServer.startup(SocketServer.scala:131)
at kafka.server.KafkaServer.startup(KafkaServer.scala:285)
at kafka.Kafka$.main(Kafka.scala:109)
at kafka.Kafka.main(Kafka.scala)
Caused by: org.apache.kafka.common.errors.InvalidConfigurationException: Invalid PEM keystore configs
Caused by: org.apache.kafka.common.errors.InvalidConfigurationException: No matching PRIVATE KEY entries in PEM file

事情是 - private.keycertificate.pemca.pem 是有效文件并与其他 applications/client 库一起使用。我曾经用它们创建 keystore/truststore 并且工作正常。使用 keystore/truststore 时,我还使用这 3 个文件从 Python 连接到 Kafka,并且工作正常。我确认这些文件有效并且与其他应用程序没有问题。

还要注意私钥是PKCS#8类型,这是Kafka期望的:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

我做错了什么?

使用 PEM 存储类型和 ssl.keystore.keyssl.keystore.certificate.chain 属性时需要指定 PEM 文件内容:

security.protocol=SSL
ssl.keystore.type=PEM

ssl.keystore.key=-----BEGIN PRIVATE KEY----- \
................................................................ \
.........................................= \
-----END PRIVATE KEY-----

ssl.keystore.certificate.chain=-----BEGIN CERTIFICATE----- \
................................................................ \
-----END CERTIFICATE-----

在 Kafka 中指定 PEM 证书的属性有点令人困惑,但希望本概述对您有所帮助。在 Kafka 中有两种指定证书的方式:作为文件或作为字符串(文件内容)。

在这两种情况下,您都需要指定以下属性:

  • ssl.keystore.type=PEM
  • ssl.truststore.type=PEM
  • ssl.key.password=(如果私钥未加密则为空)

值得重申的是,如果私钥是加密的,它必须是PKCS#8格式以便Java读取。

以文件形式提供证书

在这种情况下,您要指定以下属性:

  • ssl.keystore.location=/path/to/file/containing/certificate/chain
  • ssl.truststore.location=/path/to/truststore/certificate

这里的 'trick' 是 ssl.keystore.location 处的文件必须包含以下内容(并按此顺序):

  • 你的私钥
  • 您的签名证书
  • 任何中间 CA 证书

提供证书内容(证书作为字符串)

如果您想提供 key/certificate/root 证书的内容,那么您可以使用以下属性:

  • ssl.keystore.certificate.chain=-----BEGIN CERTIFICATE----- ...
  • ssl.keystore.key=-----BEGIN PRIVATE KEY-----...

与上面类似,ssl.keystore.certificate.chain 应包含以下内容:

  • 您的签名证书
  • 任何中间 CA 证书