我见过许多地方显示使用与下面相同的示例代码启用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条答案
按热度按时间64jmpszr1#
以上都不是。如果你不指定
ssl.keymanager.algorithm
(见sslconfigs:96)然后使用jvm默认值(参见sslengi)nebuilder:138),很可能SunX509
(唯一的标准名称是PKIX
,但没有迹象表明这有什么不同;请参见标准算法名称§ keymanagerfactory算法)。尽管描述了标准算法,rfc3280本身并没有指定密钥选择过程。但是,实际实现只是选择所需类型之一的某个密钥,相应证书的证书路径包含所需颁发者之一(请参见从sunx509keymanagerimpl.chooseclientalias开始的调用链)。因此,客户机对密钥别名的选择将由服务器表示信任的证书颁发者和服务器表示接受的密钥类型决定(现在几乎都是rsa,但将来或特定场景中可能会有所不同)。如果您只有一个由服务器信任的ca颁发的rsa密钥,那么它将选择该密钥。如果为0,则连接将失败,如果为2或更多,则不知道将选择哪一个。特别是,有一个过期和未过期的证书,两者都符合标准是一个麻烦的食谱。
我发现了一些有趣的细节
KeyManager
s和KeyStore
在一篇简短的系统博客文章中提到了这一点,但如果不修补Kafka本身,他们所谈论的一些定制将是不可能的。如果您需要更精确地控制键选择,您可能需要实现自己的keymanager或使用满足您需要的第三方keymanager。