Kafka 在尝试开始使用 PEM 证书时返回“PEM 文件中没有匹配的私钥条目”

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

首先,我看过this thread但它不相关并且有不同的问题。

我的 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$1(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$1(SocketServer.scala:262)
at kafka.network.SocketServer.$anonfun$createDataPlaneAcceptorsAndProcessors$1$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.key
certificate.pem
ca.pem
是有效文件,可以与其他应用程序/客户端库一起使用。我用它们来创建密钥库/信任库,它工作正常。使用 keystore/truststore 时,我还使用这 3 个文件从 Python 连接到 Kafka,它工作得很好。我确认这些文件有效并且与其他应用程序没有问题。

还要注意私钥是

PKCS#8
类型,这是Kafka期望的:

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

我做错了什么?

ssl apache-kafka pem
3个回答
5
投票

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

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

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

值得重申的是,如果Private Key是加密的,必须是

PKCS#8
格式才能让Java读取。

以文件形式提供证书

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

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

这里的“技巧”是

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

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

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

如果您想提供密钥/证书/根证书的内容,那么您可以使用以下属性:

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

与上述类似,

ssl.keystore.certificate.chain
应包含以下内容:

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

1
投票

使用 PEM 存储类型和

ssl.keystore.key
ssl.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-----

0
投票

对我来说产生

No matching PRIVATE KEY entries in PEM
错误的问题是证书、密钥和链是 PEM 格式,但 base64 编码。

所以在 Scala 中,解决方案是应用这个:

  private def decodeBase64(base64: String): String =
    new String(Base64.getDecoder.decode(base64), StandardCharsets.UTF_8)
© www.soinside.com 2019 - 2024. All rights reserved.