Kafka如何为客户端认证指定密钥别名?

12

我看过许多地方展示了如何使用与此处相同的示例代码启用Kafka客户端身份验证:

https://www.cloudera.com/documentation/kafka/latest/topics/kafka_security.html#deploying_ssl_for_kafka__d18295e284

即:

ssl.keystore.location=/var/private/ssl/kafka.client.keystore.jks
ssl.keystore.password=test1234
ssl.key.password=test1234
我的问题是,客户端如何指定要使用密钥库中的特定密钥?在其他地方讨论JKS密钥库时,密钥是使用别名指定的。 我能想到的只有以下几点: - 别名应该是硬编码的(但我找不到相关的参考资料) - 预期只有一个密钥在密钥库中,因此它会使用找到的第一个密钥 - 它会扫描并使用第一个密码与ssl.key.password属性的值匹配的密钥
1个回答

6

以上都不对。如果您没有指定ssl.keymanager.algorithm(请参见SslConfigs:96),那么它将使用JVM默认值(请参见SslEngineBuilder:138),这可能是SunX509(唯一的标准名称是PKIX,但没有表明它有什么不同之处;请参见Standard Algorithm Names § KeyManagerFactory algorithms)。尽管标准算法的描述,RFC 3280并没有明确指定密钥选择过程。然而,实际的实现只是选择一个所需类型之一的某个密钥,其相应证书的认证路径包含所需颁发者之一(请参见从SunX509KeyManagerImpl.chooseClientAlias开始的调用链)。

因此,客户端选择的密钥别名将受服务器信任的证书颁发机构和服务器接受的密钥类型的制约(现在几乎总是RSA,但在未来或特定情况下可能会有所不同)。如果您只有一把由服务器信任的CA颁发的RSA密钥,则它将选择该密钥。如果没有密钥,则连接将失败;如果有两个或更多密钥,则无法确定将选择哪一个。特别地,拥有一个过期和一个未过期的证书都符合条件是会引发麻烦的。

我在terse systems 博客文章中找到了一些关于KeyManagerKeyStore的有趣细节,但其中一些定制将需要对Kafka进行补丁才能实现。如果您需要更精确地控制密钥选择,您可能需要自己实现KeyManager或使用符合您需求的第三方KeyManager。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接