首先,我看过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,它工作得很好。在使用keystore/truststore时,我还使用了这3个文件从Python连接到Kafka,它工作得很好。我确认这些文件是有效的,并且与其他应用程序没有问题。
还要注意私钥是PKCS#8
类型,这是Kafka所期望的:
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
我做错了什么?
3条答案
按热度按时间mnemlml81#
在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
这里的'技巧'是
ssl.keystore.location
的文件必须包含以下内容(并且按照这个确切的顺序):提供证书内容(字符串形式的证书)
如果你想提供密钥/证书/根证书的内容,那么你可以使用以下属性:
ssl.keystore.certificate.chain=-----BEGIN CERTIFICATE----- ...
ssl.keystore.key=-----BEGIN PRIVATE KEY-----...
与上面类似,
ssl.keystore.certificate.chain
应该包含以下内容:gpfsuwkq2#
使用PEM存储类型和
ssl.keystore.key
和ssl.keystore.certificate.chain
属性时,需要指定PEM文件内容:3bygqnnd3#
对我来说,产生
No matching PRIVATE KEY entries in PEM
错误的问题是证书,密钥和链是PEM格式的,但base64编码。所以在Scala中,解决方案是这样的: