मेरा सेटअप:

  • जेडीके 11.0.6
  • स्प्रिंग बूट 2.2.4.रिलीज
  • स्प्रिंग-काफ्का 2.4.1

मैंने अपने ज़ूकीपर/काफ्का/क्लाइंट एप्लिकेशन को प्लेनेटटेक्स्ट में सत्यापित किया है, सब ठीक काम करता है। मैंने काफ्का क्लाइंट टूल्स के साथ अपने कीस्टोर्स/ट्रस्ट स्टोर्स को भी सत्यापित किया है।

मैं अपने विषयों को कॉन्फ़िगर करने के लिए काफ्काएडमिन बीन का उपयोग कर रहा हूं, ऐसा लगता है कि यह एसएसएल कनेक्शन पर विफल हो रहा है:

@Bean
public KafkaAdmin kafkaAdmin() {
    Map<String, Object> configs = new HashMap<>();
    configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, getKafkaHost());
    configs.put("security.protocol", "SSL");
    configs.put("ssl.key.password", "xxx");
    configs.put("ssl.keystore.location", "/keystore/client.keystore.jks");
    configs.put("ssl.keystore.password", "xxx");
    configs.put("ssl.truststore.location", "/keystore/kafka.truststore.jks");
    configs.put("ssl.truststore.password", "xxx");
    return new KafkaAdmin(configs);
}

मेरी दो जेकेएस फाइलें मेरे प्रोजेक्ट में src/main/resource/keystore में हैं। /keystore काम नहीं करता... ऐसा लगता है कि अगर मैं /src/main/resources/keystore/client.keystore.jks... निर्दिष्ट करूं तो वे उठा रहे हैं क्या यह वास्तविक दुनिया में काम करने वाला है? एक स्टैंडअलोन टॉमकैट में रनटाइम पर, एक /src/main/resources/keystore होने वाला है?

मेरी समझ से, पथ target/classes फ़ोल्डर के सापेक्ष हैं, नहीं?

2
SledgeHammer 4 फरवरी 2020, 03:29

1 उत्तर

सबसे बढ़िया उत्तर

काफ्का क्लाइंट या स्प्रिंग सीधे पथ के साथ प्रदान की गई .jks फ़ाइल को हल नहीं कर सका, भले ही आप एक पूर्ण पथ प्रदान करते हों। एक सापेक्ष पथ प्रदान करें जैसे src/main/resources/keystore एक अच्छा विचार नहीं है क्योंकि निर्माण के बाद आपकी resources निर्देशिका सामग्री सीधे target/classes में कॉपी हो जाएगी जैसा कि आप पहले से ही जानते हैं।

इसलिए, फ़ाइल को सीधे org.springframework.core.io.Resource टाइप इंस्टेंस के लिए classpath से वैल्यू एनोटेशन का उपयोग करके बाइंड करें।

@Value("classpath:certs/keystore/kafka.keystore.jks")
private Resource keystore;

@Value("classpath:certs/truststore/kafka.truststore.jks")
private Resource truststore;

फिर उस उदाहरण से इस तरह पूर्ण पथ प्राप्त करें;

configs.put("ssl.keystore.location", keystore.getFile().getAbsolutePath());
configs.put("ssl.truststore.location", truststore.getFile().getAbsolutePath());

जैसा कि आप देख सकते हैं, Keystore और Truststore फ़ाइल classpath में होनी चाहिए। मेरे मामले में, वे क्रमशः src/resources/certs/keystore और src/resources/certs/truststore निर्देशिकाओं में हैं।

2
Sachith Dickwella 4 फरवरी 2020, 05:44