2011-02-07 13 views
7

मेरे पास जावा कीस्टोर और कीटोल पर निम्नलिखित प्रश्न हैं। मुझे लगता है कि एक कीस्टोर में 1 से अधिक प्रमाणपत्र हो सकते हैं। जैसा कि मैंने कोशिश की है, keytool के माध्यम से मैं एक कीस्टोर बना सकता हूं, और इस कीस्टोर तक पहुंचने के लिए मुझे एक पासवर्ड सेट करना होगा। प्रत्येक प्रमाणपत्र प्रविष्टि तक पहुंचने के लिए मुझे एक पासवर्ड सेट करना होगा। क्या कुंजीस्टोर और प्रविष्टियों के लिए एक ही पासवर्ड रखना अनिवार्य है? यदि नहीं (और मुझे लगता है कि यह मानना ​​उचित है) निम्नलिखित कोड क्यों है:जावा कीस्टोर और पासवर्ड सेटिंग्स

char[] pwd = new char[]{'s','e','c','r','e','t'}; 
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
ks.load(new FileInputStream("myPersonal.keystore"), pwd); 
kmf.init(ks, pwd);//fails here with exception 

मुझे निम्नलिखित अपवाद देता है?

Exception in thread "main" java.security.UnrecoverableKeyException: Cannot recover key 
    at sun.security.provider.KeyProtector.recover(Unknown Source) 
    at sun.security.provider.JavaKeyStore.engineGetKey(Unknown Source) 
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(Unknown Source) 
    at java.security.KeyStore.getKey(Unknown Source) 

secret कुंजीस्टोर myPersonal.keystore मैं Keytool के माध्यम से बनाया है जो उपयोग करने के लिए पासवर्ड है। प्रमाण पत्र, 1 डीएसए और 1 आरएसए के लिए इसमें 2 प्रविष्टियां हैं। प्रत्येक केस्टस्टोर (और एक दूसरे) के साथ एक अलग पासवर्ड होता है। अब कोड सही है, क्योंकि अगर मैं एक हीस्टोर एंट्री के साथ एक कीस्टोर का उपयोग करता हूं, जिसमें कुंजीस्टोर के समान पासवर्ड होता है तो कोई अपवाद नहीं होता है और प्रोग्राम ठीक चलता है।

तो यहां समस्या क्या है? मेरे पास अलग-अलग पासवर्ड नहीं होना चाहिए? मेरे पास कई प्रमाणपत्र नहीं होना चाहिए? और क्या?

उत्तर

7

जैसा कि एपीआई द्वारा निर्दिष्ट किया गया है, KeyManagerFactory.init विधि कुंजीस्टोर से कुंजी पुनर्प्राप्त करने के लिए उपयोग किए गए पासवर्ड में होती है। चूंकि केवल एक पासवर्ड पैरामीटर है, इसलिए यह उम्मीद कर रहा है कि सभी चाबियों के लिए पासवर्ड समान है। यदि किसी एक कुंजी के लिए एक अलग पासवर्ड का उपयोग किया जाता है, तो आपको उस त्रुटि को प्राप्त होता है क्योंकि उस विशेष कीस्टोर प्रविष्टि के लिए पासवर्ड गलत है।

आपके लिए सबसे आसान समाधान कुंजीस्टोर में सभी प्रविष्टियों के लिए एक ही पासवर्ड का उपयोग करना होगा। यदि आप प्रत्येक प्रविष्टि के लिए अलग-अलग पासवर्ड बनाए रखने पर सेट हैं, तो आपको अपने स्वयं के कस्टम सुरक्षा तत्वों, उदाहरण के लिए, KeyManager बनाने की आवश्यकता हो सकती है।

+0

तो आप कह रहे हैं कि यह एक निहित आवश्यकता है? क्या इस प्रतिबंध को KeyManagerFactory में मजबूर करने का कोई कारण है? मुझे लगता है कि वास्तविक परिदृश्यों में सामान्य केस विभिन्न पासवर्ड – Cratylus

+0

का उपयोग करना है यह KeyManagerFactory की एपीआई परिभाषा के लिए निहित है । मुझे लगता है कि एपीआई सबसे सरल परिदृश्य को संभालने के लिए बनाया गया था, जो कि सभी चाबियों का एक ही पासवर्ड होगा। KeyManagerFactory एक साधारण तंत्र है जो कवर करता है जो अधिक सामान्य दृष्टिकोण हो सकता है (मैंने सत्यापित नहीं किया है)। कीस्टोर एपीआई आपको विभिन्न पासवर्ड के साथ विभिन्न कुंजियों तक पहुंचने की अनुमति देता है, जो आपको अधिक जटिल परिदृश्यों के लिए कार्यक्षमता बढ़ाने की अनुमति देता है। एपीआई परिभाषा के पीछे तर्क के रूप में ... यह कहना मुश्किल है। –

+0

यह काम करता है। मदद की सराहना करो! – Bai