2010-04-21 9 views
20

मैं openssl के साथ एक प्रमाणन कुंजी उत्पन्न करता हूं।क्या जावा कुंजी स्टोर ओपनएसएसएल द्वारा उत्पन्न एक कुंजी जोड़ी आयात कर सकता है?

openssl genrsa -des3 -out enc_key.pem 1024

मैं प्रमाणपत्र फ़ाइल में निर्यात करते हैं, तो जावा Keytool साथ मैं जावा कुंजीस्टोर (JKS) में आयात: यहाँ मेरी आदेश है।

कीस्टोर अच्छा लगता है। मैं अपने जावा ऐप से कीस्टोर लोड कर सकता हूं।

समस्या है जब ग्राहक सर्वर से कनेक्ट (इस मामले में FTP सर्वर, नहीं वेब सर्वर है, और मैं अपाचे मीना का उपयोग करें), अपवाद उत्पन्न हुई:

javax.net.ssl.SSLHandshakeException: SSL handshake failed. at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:433) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$5(DefaultIoFilterChain.java:429)

...

Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common at com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source) at javax.net.ssl.SSLEngine.wrap(Unknown Source)

...

Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)

कुछ चीजें है कि मैं पूछना चाहता हूँ है:

  1. ओपनएसएल के साथ उत्पन्न प्रमाणन के सिफर क्या हैं? हम कैसे जान सकते हैं? शायद कमांड लाइन openssl xxx द्वारा?
  2. मैं http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA पर जाता हूं। और मैंने एसएसएल_आरएसए_एक्सएक्स को सक्षम सिफर सुइट्स में रखा है, लेकिन अभी भी काम नहीं कर सकता है (मैंने एसएसएल_आरएसए रखा क्योंकि यह एसएसएल एसएसएल इंपिसिटिट और जेनर्स का उपयोग कर रहा है, सिर्फ मेरी राय जेनर्स आरएसए उत्पन्न करती है)। क्या यह सही है?
  3. कोई भी समाधान जानता है?
  4. या, कोई भी जानता है कि जब तक जावा ऐप (सिफर के साथ बंद) में उपयोग किया जा सकता है तब तक openssl कमांड लाइन से मानक कीस्टोर कैसे उत्पन्न करें। क्योंकि अभी मैं openssl से प्रमाणीकरण उत्पन्न कर सकता हूं और निर्यात कीस्टोर जावा निर्यात कर सकता हूं, लेकिन मुझे नहीं पता कि मैंने किस सिफर का उपयोग किया है और मैं जावा ऐप में कैसे उपयोग करता हूं। नोट: यदि कुंजीस्टोर सीधे जावा से उत्पन्न होता है तो मैं चला सकता हूं। अभी समस्या यह है कि अगर जावा कीटोल द्वारा प्रमाणन से उत्पन्न कीस्टोर जैसे openssl (और अन्य शायद)।

किसी भी मदद की सराहना की जाएगी! धन्यवाद

उत्तर

45

आप कुंजीपटल उत्पन्न करने के लिए ओपनएसएसएल का उपयोग क्यों कर रहे हैं? क्यों न केवल keytool का उपयोग करें?

genrsa उपकरण सिर्फ एक निजी कुंजी उत्पन्न करता है। आप एक संबंधित प्रमाणपत्र कैसे बना रहे हैं? आप अपने जावा कीस्टोर में निजी कुंजी कैसे आयात कर रहे हैं? (मैं पूछता हूं, क्योंकि keytool केवल मौजूदा कुंजी स्टोर से केवल एक निजी कुंजी आयात कर सकता है, और केवल जावा 6 से आगे।)

मुझे संदेह है कि आपकी समस्या यह है कि आपकी कुंजी स्टोर में कोई महत्वपूर्ण प्रविष्टि नहीं है (निजी कुंजी और इसी प्रमाणपत्र)। जब आप keytool के साथ कीस्टोर सामग्री सूचीबद्ध करते हैं, तो कितनी प्रविष्टियां हैं? क्या वे महत्वपूर्ण प्रविष्टियां या भरोसेमंद प्रविष्टियां हैं?


सर्वर को स्वयं प्रमाणित करने के लिए निजी कुंजी तक पहुंच की आवश्यकता है। एक निजी कुंजी आयात करने के लिए, जावा 6 का बढ़ाया keytool का उपयोग करें।

openssl pkcs12 -export -in cert.pem -inkey key.pem > server.p12 

फिर एक जावा कुंजी संग्रह में इस स्टोर कन्वर्ट:

keytool -importkeystore -srckeystore server.p12 -destkeystore server.jks -srcstoretype pkcs12 

अब

कुंजी और OpenSSL के साथ प्रमाण पत्र बनाने के बाद, PKCS # 12 कुंजी संग्रह बनाने के लिए OpenSSL का उपयोग अपने एसएसएल-सक्षम सर्वर में server.jks का उपयोग करें, जिसमें प्रमाणपत्र और निजी कुंजी शामिल है।

+0

असल में, मैं जावा कीटोल द्वारा उत्पन्न कीस्टस्टोर के साथ ऐप चला सकता हूं (मेरा प्रश्न बिंदु 4 देखें) (हाँ, जैसा कि आपने कहा, यह सही है, मैंने पहले ही यह किया है)। यह अच्छी तरह से काम करता है अगर मैं जावा कीटोल से सीधे कीस्टोर (जेक्स) उत्पन्न करता हूं तो मेरा ऐप (एफटीपीएस सर्वर) बस उस कीस्टोर का उपयोग करता है। उस के साथ कोई समस्या नहीं। आपका प्रश्न है कि मैं कुंजीपैर उत्पन्न करने के लिए ओपनएसएसएल का उपयोग क्यों कर रहा हूं क्योंकि वर्तमान में क्लाइंट के पास लाइसेंस प्रमाणीकरण (Verisign) है इसलिए मुझे पहले openssl के साथ परीक्षण करना होगा। बीटीडब्ल्यू, कीटोल प्रमाण x509 से आयात कर सकता है (कमांड करके: openssl req -x509 -key key.pem -in req.pem -out cert.pem -days 365) – Jef

+0

ऊपर से जारी रखें मैंने जेनरेट की गई कुंजी आयात की है जावा कीस्टोर (जेक्स) में openssl और जावा ऐप ने कहा कि कीस्टोर पहले से ही मान्य है (मैं दूसरी कुंजी कोशिश करता हूं, जावा इसकी वैध कीस्टोर को सत्यापित कर सकता है या नहीं)। समस्या यह है कि जब मैं कीस्टोर के माध्यम से ऐप चलाता हूं (ओपनएसएल प्रमाण से जावा कीटोल आयात द्वारा उत्पन्न), ऐप ऊपर अपवाद फेंकता है। कुंजीस्टोर में एक महत्वपूर्ण प्रविष्टि होती है (यह httpd ssl में काम करती है), जब मैं कीटोल सूची करता हूं, तो प्रविष्टि पहले ही भरोसेमंद है। मैं यह आदेश करता हूं: keytool -import -v -trustcacerts -alias server-alias -file cert.pem -keystore cacerts.jks -keypass x -storepass x – Jef

+0

@Jef - * नहीं, * यह सही नहीं है, या आपका प्रोग्राम काम करेगा; सिर्फ इसलिए कि आपकी कुंजी स्टोर वैध * प्रारूप * में है, इसका मतलब यह नहीं है कि * इसमें * सर्वर को प्रमाणीकृत करने के लिए आवश्यक जानकारी शामिल है। विशेष रूप से, आपका बयान, "जब मैं एक कीटोल सूची करता हूं, तो प्रविष्टि पहले ही भरोसेमंद है," ऐसा लगता है कि यह एक ट्रस्ट एंट्री है, न कि एक महत्वपूर्ण प्रविष्टि। ** एक ट्रस्ट एंट्री काम नहीं करेगी- कोई निजी कुंजी नहीं है। ** कुछ साधारण तर्क लागू करें: क्या आपने कभी 'कीटोल' को निजी कुंजी वाली फाइल दी है? निजी कुंजी उपलब्ध कराए बिना आप सर्वर प्रमाणीकरण करने की अपेक्षा कैसे करते हैं? – erickson

संबंधित मुद्दे