Kafka代理仅公开PEM(即ca证书,客户端密钥,客户端证书,没有JKS),Java客户端是否可行?

时间:2019-09-13 16:27:18

标签: java ssl apache-kafka kafka-consumer-api pem

我正在编写一个Java程序来与Kafka经纪人进行通信。 Kafka代理(通过REST API)提供客户端证书,客户端密钥和ca证书。 KafkaConsumer成功实例化,但是执行poll()方法时会抛出 org.apache.kafka.common.errors.SslAuthenticationException 最终追溯到“无法找到到请求目标的有效证书路径”。

Internet搜索似乎表明Java客户端必须使用JKS,但是有一些参考(包括SO中的内容)似乎暗示了使用keytool和openssl来使此类Java客户端正常工作的方法。

我有一个与此相同代理一起使用的Python客户端。用于实例化使用者的属性:

...片段...

cons_props = {
    'bootstrap.servers': '%s' % self.kafka_host,
    'group.id': 'mygroup', 'session.timeout.ms': 8000,
    'default.topic.config': { 'auto.offset.reset': 'smallest' },
    'ssl.certificate.location': self.kafka_client_cert,
    'ssl.key.location': self.kafka_client_key,
    'security.protocol': 'ssl', 
    'ssl.ca.location': self.kafka_root_cert }

...片段...

利用上面的(有效的)Python属性以及我所了解的有关Kafka和Java客户端的信息,我的属性是:

...片段...

consumerProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.60.100:9093");
consumerProps.put(ConsumerConfig.GROUP_ID_CONFIG, "mygroup");
consumerProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
    StringDeserializer.class.getName());
consumerProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
    StringDeserializer.class.getName());
consumerProps.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
consumerProps.put("security.protocol", "SSL");
consumerProps.put("ssl.certificate.location", getClientCertLocation());
consumerProps.put("ssl.key.location", getClientKeyLocation());
consumerProps.put("ssl.ca.location", getRootCertLocation());

workQueue = (KafkaConsumer<String, String>)
            new KafkaConsumer<String, String>(consumerProps);

workQueue.subscribe(Arrays.asList("q_name");

ConsumerRecords<String, String> r;
try {
    r = (ConsumerRecords<String, String>)kc.poll(10);

...片段...

如果ssl。*属性是假的,我希望(也许是天真的)Java KafkaConsumer ctor会抱怨。但是ctor,subscribe都很好,但是使用poll方法抛出了异常。

如上所述,看来我必须使用JKS,但是 1)不确定是否有可能,因为我几乎无法访问代理配置,并且 2)我不知道是否可以将密钥和证书转换为jks,一旦完成,在经纪人仅“讲” PEM的情况下是否可以正常工作。

这是我对SO提出的第一个问题。希望它不太冗长,同时对他人有所帮助。 (当然,我不是第一个尝试此操作的人吗?)

0 个答案:

没有答案