Kafka如何为客户端身份验证指定密钥别名?

foo*_*sus 9 ssl keystore client-certificates apache-kafka

我已经看到很多地方使用相同的示例代码显示启用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
Run Code Online (Sandbox Code Playgroud)

我的问题是,客户端如何指定要使用的密钥库中的特定密钥?在其他地方我看到JKS密钥库讨论过,密钥是使用别名指定的.我唯一能想到的是:

  • 别名预计是硬编码的(但我找不到这个事实的参考)
  • 预计密钥库中只有一个密钥,因此它使用它找到的第一个密钥
  • 它扫描并使用密码与ssl.key.password属性值匹配的第一个

kbo*_*ino 6

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

因此,客户端对密钥别名的选择将由服务器表示信任的证书颁发者以及服务器表示接受的密钥类型决定(今天几乎总是 RSA,但将来或将来可能会有所不同)具体场景)。如果您只有 1 个由服务器信任的 CA 颁发的 RSA 密钥,那么这就是服务器将选择的密钥。如果为 0,则连接将失败,如果为 2 或更多,则不知道会选择哪一个。特别是,拥有符合标准的过期和未过期证书会带来麻烦。

我在一篇简洁的系统博客文章KeyManager中发现了一些关于s 和KeyStores 的有趣细节,但是他们谈论的一些定制如果不修补 Kafka 本身就不可能实现。如果您需要更精确地控制密钥选择,您可能必须实现自己的 KeyManager 或使用满足您需求的第三方密钥管理器。