इसके कारण: java.security.UnrecoverableKeyException: कुंजी पुनर्प्राप्त नहीं की जा सकती


84

मुझे ABCC_client.store नाम के jks keystore की आपूर्ति की जाती है। जब मैं इस काइस्टोर को कैसर्ट में आयात करता हूं और इसे कनेक्ट करने का प्रयास करता हूं, तो ऐसा कोई एल्गोरिथम त्रुटि नहीं कहा जाता है। PFA स्टैकट्रेस

    Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class:   com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
    at java.security.Provider$Service.newInstance(Provider.java:1245)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:220)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:147)
    at javax.net.ssl.SSLContext.getInstance(SSLContext.java:125)
    at javax.net.ssl.SSLContext.getDefault(SSLContext.java:68)
    at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:102)
    at org.apache.axis.components.net.JSSESocketFactory.initFactory(JSSESocketFactory.java:61)
    at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:79)
    ... 32 more
Caused by: java.security.UnrecoverableKeyException: Cannot recover key
    at sun.security.provider.KeyProtector.recover(KeyProtector.java:311)
    at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:121)
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:38)
    at java.security.KeyStore.getKey(KeyStore.java:763)
    at com.sun.net.ssl.internal.ssl.SunX509KeyManagerImpl.<init>(SunX509KeyManagerImpl.java:113)
    at com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:48)
    at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:239)
    at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultKeyManager(DefaultSSLContextImpl.java:170)
    at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(DefaultSSLContextImpl.java:40)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at java.security.Provider$Service.newInstance(Provider.java:1221)
    ... 39 more

लेकिन अगर मैं स्वतंत्र रूप से अर्थात इस कैसर को जोड़ने के बिना इसका उपयोग करता हूं तो यह काम करता है।

कुछ गोग्लिंग ने मुझे http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/ के लिए नेतृत्व किया, जो कहता है कि पासवर्ड मेरे लिए अलग हो सकता है कुंजी और कीस्टोर।


यदि संभव हो तो क्या कहा जाता है यह देखने के लिए थोड़ा सा कोड?
ब्रूनो

मैं कोड के भीतर से एक वेब सेवा विधि को कॉल करने की कोशिश कर रहा था..एक्सीसफॉल्ट फॉल्टकोड: { schemas.xmlsoap.org/soap/envelope } Server.userException गलतीSubcode: गलतीString: java.net.SocketException: java.security.NoSuchAlgorithmException: त्रुटि निर्माण कार्यान्वयन (कलन विधि: डिफ़ॉल्ट, प्रदाता: SunJSSE, वर्ग: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
मृणाल भट्टाचार्य

2
यहाँ डुप्लिकेट किया जा सकता है एक asnwer के साथ एक समान प्रश्न है
icrovett

नहीं मेरा मुद्दा कीस्टोर काम करता है अगर हम सिस्टम गुणों को उस कीस्टोर का उपयोग करने के लिए सेट करते हैं। लेकिन अगर हम jvm के डिफॉल्ट में उस कीस्टॉर को लोड करते हैं यानी कैसर्ट करते हैं तो यह डस्ट wrk है। यह बुरा प्रमाण पत्र कहता है ..
मृणाल भट्टाचार्जी

जवाबों:


109

यदि Tomcat 6 और पहले का उपयोग कर रहे हैं, तो सुनिश्चित करें कि कीस्टोर पासवर्ड और कुंजी पासवर्ड समान हैं। यदि टॉमकैट 7 और बाद का उपयोग कर रहे हैं, तो सुनिश्चित करें कि वे एक ही हैं या कि server.xmlफ़ाइल में कुंजी पासवर्ड निर्दिष्ट है ।


10
यह सच है। संदर्भ tomcat.apache.org/tomcat-6.0-doc/…
अथर्व

2
प्रासंगिक उद्धरण: अंत में, आपको कुंजी पासवर्ड के लिए संकेत दिया जाएगा , जो कि विशेष रूप से इस प्रमाणपत्र के लिए पासवर्ड है (जैसा कि उसी कीस्टॉर फ़ाइल में संग्रहीत किसी अन्य प्रमाण पत्र के विपरीत)। आप यहाँ उसी पासवर्ड का उपयोग करना चाहिए जैसा कि कीस्टोर पासवर्ड के लिए उपयोग किया गया था। यह टॉमकैट कार्यान्वयन का एक प्रतिबंध है। (वर्तमान में, keytoolप्रॉम्प्ट आपको बताएगा कि ENTER कुंजी दबाने से यह आपके लिए स्वचालित रूप से हो जाता है।)
कप्तान मैन

मेरे पास यह समस्या थी कि JMeter (https) coz Java कीस्टोर और कुंजी पासवर्ड अलग-अलग थे। रेफरी stackoverflow.com/questions/2889238/... । समस्या को हल करने के लिए कुंजी पासवर्ड बदलने के लिए। बड़ी मदद! धन्यवाद।
ऋषि

@CaptainMan यह केवल Tomcat6 में सच है, Tomcat7 से यह नहीं है
एंड्रिया लिगियोस

2
@AndreaLigios अच्छा बिंदु, प्रासंगिक उद्धरण: अंत में, आपको कुंजी पासवर्ड के लिए संकेत दिया जाएगा , जो कि विशेष रूप से इस प्रमाणपत्र के लिए पासवर्ड है (जैसा कि उसी की -स्टोर फ़ाइल में संग्रहीत किसी अन्य प्रमाण पत्र के विपरीत)। keytoolशीघ्र आपको बताएगा कि दबाने कुंजी ENTER स्वतः कीस्ट्रोक के रूप में कुंजी के लिए एक ही पासवर्ड का उपयोग करता है। आप एक ही पासवर्ड का उपयोग करने के लिए या एक कस्टम का चयन करने के लिए स्वतंत्र हैं। यदि आप कीस्टॉर पासवर्ड के लिए एक अलग पासवर्ड चुनते हैं, तो आपको server.xmlकॉन्फ़िगरेशन फ़ाइल में कस्टम पासवर्ड भी निर्दिष्ट करना होगा ।
कैप्टन मैन

73

आपके एप्लिकेशन / कॉन्फिगर में परिभाषित निजी कुंजी पासवर्ड गलत है। पहले निजी कुंजी पासवर्ड को दूसरे में बदलकर सत्यापित करने का प्रयास करें:

keytool -keypasswd -new changeit -keystore cacerts -storepass changeit -alias someapp -keypass password

उपरोक्त उदाहरण पासवर्ड से पासवर्ड को बदलने के लिए बदलता है। यदि निजी कुंजी पासवर्ड पासवर्ड था, तो यह कमांड सफल होगा।


2
जबकि मैंने इस उत्तर का उपयोग प्रश्न के संबंध में नहीं किया था। यह कीस्टोर फाइल, स्टोर पासवर्ड, अलियास / की, और कुंजी पासवर्ड को मान्य करने के लिए मददगार था।
रस

1
कृपया याद रखें कि इस कमांड को निष्पादित करने के बाद आप कीस्टोर पासवर्ड बदल देंगे। आपको पासवर्ड वापस मूल एक पर सेट करना होगा।
जर्सजैरागोसिन

वास्तव में, यह सिर्फ निर्दिष्ट करने के लिए -keypasswd -keystore storefile -alias somealiasऔर एक संकेत में बाकी सब कुछ दर्ज करने के लिए पर्याप्त है ।
एंड्री रीजेंटोव

इस कोड को चलाने पर मुझे निम्नलिखित त्रुटि हो रही है - "keytool error: java.security.UnrecoverableKeyException: Cannot recover key"क्या यह जांचने का कोई तरीका है कि मेरा उपनाम कुंजी पासवर्ड क्या है या पुराने को जाने बिना इसे बदल दें?
कविन राजू एस

10

Cannot recover keyअपवाद न होने के लिए , मुझे जावा की स्थापना के लिए जावा क्रिप्टोग्राफी एक्सटेंशन (जेसीई) असीमित शक्ति क्षेत्राधिकार नीति फ़ाइलों को लागू करना था जो कि मेरा एप्लिकेशन चला रहा था। उन फ़ाइलों के संस्करण 8 को यहां पाया जा सकता है या नवीनतम संस्करण को इस पृष्ठ पर सूचीबद्ध किया जाना चाहिए । डाउनलोड में एक फ़ाइल शामिल है जो बताती है कि नीति फ़ाइलों को कैसे लागू किया जाए।


JDK 8u151 के बाद से पॉलिसी फाइलों को जोड़ना आवश्यक नहीं है। इसके बजाय जेसीई क्षेत्राधिकार नीति फाइलों को एक सुरक्षा संपत्ति कहा जाता है crypto.policyunlimitedJDK द्वारा असीमित क्रिप्टोग्राफी का उपयोग करने की अनुमति देने के साथ सेटिंग । उपरोक्त राज्य से जुड़े रिलीज़ नोट्स के रूप में, इसे फ़ाइल द्वारा Security.setProperty()या उसके द्वारा सेट किया जा सकता है java.securityjava.securityफ़ाइल भी जोड़कर से संलग्न किया जा सकता है -Djava.security.properties=my_security.propertiesआदेश के लिए कार्यक्रम शुरू करने के लिए के रूप में विस्तृत यहाँ


चूंकि JDK 8u161 असीमित क्रिप्टोग्राफी डिफ़ॉल्ट रूप से सक्षम है।


3
पॉलिसी फ़ाइल जार स्थापित होने के बावजूद मैं यह त्रुटि देख रहा हूं।
एडम

@ अदम मेरा समाधान एक विशिष्ट मामले के लिए है, जो आपके द्वारा अनुभव किए जा रहे अलग हो सकता है। हालाँकि मैंने JDK 8u151 में होने वाले परिवर्तन को प्रतिबिंबित करने के लिए एक अपडेट जोड़ा है।
व्हाइटकनाइट

5

जब हम ने 64 बिट ओपनएसएसएल वर्जन का उपयोग कर बनाया गया था, तो कीस्टोर में एक कुंजी आयात करने पर मुझे वही त्रुटि हुई थी। जब हमने किस्टोर में कुंजी को आयात करने के लिए एक ही प्रक्रिया का पालन किया था जो कि 32 बिट ओपनएसएसएल संस्करण का उपयोग करके बनाया गया था तो सब कुछ ठीक हो गया।


3
ऊपर त्रुटि का मूल कारण java.security.UnrecoverableKeyException था: कुंजी पुनर्प्राप्त नहीं कर सकता। इसका कारण एक गलत पासवर्ड हो सकता है जैसा कि ऊपर उल्लेख किया गया है, लेकिन 64 बिट ओपनएसएसएल कार्यान्वयन के साथ एक कीस्टोर का निर्माण भी है। इसलिए मैं अपने उत्तर को एक अन्य संभावित समाधान मानता हूं। इसने मुझे उसी त्रुटि स्थिति में मदद की, इसलिए मैंने यहां समाधान प्रदान किया।
हेमी डिक

Opensl जावा कीस्टोर फाइलें नहीं बनाता है। क्या आप इसे स्पष्ट कर सकते हैं?
Aled

जवाब देने के लिए सोचता है। मैं एक ही समस्या का सामना कर रहा हूं जब https वेबसर्विस खोलना OpenESB 3.05। मैं आपके निर्देशों का पालन करता हूं और ओपनएसएस के एक 32 बिट कार्यान्वयन के साथ फिर से jks फाइल उत्पन्न करता हूं और यह ठीक काम करता है
मार्टी प्लीज सोलह

2

जाँच करें कि क्या आप जो पासवर्ड इस्तेमाल कर रहे हैं, वह कमांड के नीचे चलकर सही है

keytool -keypasswd -new temp123 -keystore awsdemo-keystore.jks -storepass temp123 -alias movie-service -keypass changeit

अगर आपको नीचे त्रुटि हो रही है तो आपका पासवर्ड गलत है

keytool error: java.security.UnrecoverableKeyException: Cannot recover key
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.