2012-02-15 13 views
49

मैं एक सुरक्षित webservice से कनेक्ट करने की कोशिश कर रहा हूँ।जावा एसएसएल हैंडशेक के दौरान क्लाइंट प्रमाणपत्र क्यों नहीं भेजता है?

मुझे एक हैंडशेक विफलता मिल रही थी, भले ही मेरे कीस्टोर और ट्रस्टस्टोर को सही ढंग से सेट किया गया हो।

निराशा के कई दिनों के बाद, अंतहीन googling और मुझे चारों ओर पूछने के बाद पता चला कि एकमात्र समस्या यह थी कि जावा ने हैंडशेक के दौरान सर्वर को क्लाइंट प्रमाणपत्र नहीं भेजना चुना।

विशेष रूप से: - यानी

  • जावा कुंजीस्टोर में देखा है और केवल मेरे मुवक्किल पाया "मुझे एक प्रमाणपत्र है कि जड़ सीए द्वारा हस्ताक्षर किए है"

    1. सर्वर क्लाइंट प्रमाणपत्र (सीएन = RootCA) का अनुरोध किया प्रमाण पत्र जिसे "सबसीए" द्वारा हस्ताक्षरित किया गया है, जो बदले में "रूटका" द्वारा जारी किया जाता है। यह ट्रस्टस्टोर में देखने के लिए परेशान नहीं था ... duh ठीक है मुझे लगता है कि
    2. अफसोस की बात है जब मैंने कीस्टोर में "सबकाए" प्रमाणपत्र जोड़ने की कोशिश की, जिसने मदद नहीं की। मैंने जांच की कि प्रमाण पत्र कुंजीस्टोर में लोड हो जाते हैं या नहीं। वे करते हैं, लेकिन KeyManager क्लाइंट को छोड़कर सभी प्रमाणपत्रों को अनदेखा करता है।
    3. तथ्य यह है कि जावा का फैसला करता है यह किसी भी प्रमाण पत्र है कि सर्वर के अनुरोध को संतुष्ट नहीं है और

    मेरे सवालों का :-(कुछ भी नहीं ... tadaaa हाथ मिलाना विफलता भेजता करने के लिए ऊपर की ओर जाता है के सभी:

    1. क्या यह संभव है कि मैंने "सबकै" प्रमाणपत्र को किस्टोर को इस तरह से जोड़ा कि "प्रमाणपत्र श्रृंखला तोड़ दी" या कुछ ऐसा है कि KeyManager केवल क्लाइंट प्रमाणपत्र लोड करता है और बाकी को अनदेखा करता है? (क्रोम और openssl आंकड़े को प्रबंधित करने के लिए प्रबंधन करता है तो बाहर क्यों जावा नहीं हो सकता है? - ध्यान दें कि "सबसीए" प्रमाण हमेशा विश्वसनीय प्राधिकारी के रूप में अलग से प्रस्तुत किया जाता है ताकि क्रोम ऐपारे हैंडशेक के दौरान क्लाइंट प्रमाण के साथ सही ढंग से पैक करता है)
    2. क्या यह सर्वर की तरफ औपचारिक "कॉन्फ़िगरेशन समस्या" है? सर्वर एक तीसरी पार्टी है। मैं उम्मीद करता हूं कि सर्वर "सबका" प्राधिकरण द्वारा हस्ताक्षरित प्रमाण पत्र का अनुरोध करेगा क्योंकि उन्होंने हमें वह प्रदान किया है। मुझे संदेह है कि यह क्रोम और openssl में काम करता है क्योंकि वे "कम प्रतिबंधक" हैं और जावा सिर्फ "पुस्तक द्वारा" चला जाता है और विफल रहता है।

    मैंने इसके लिए एक गंदे कामकाज को एक साथ रखने का प्रबंधन किया, लेकिन मैं इसके बारे में बहुत खुश नहीं हूं इसलिए अगर कोई मुझे मेरे लिए यह स्पष्ट कर सकता है तो मुझे खुशी होगी।

  • +2

    @ ब्रूनो के जवाब में जोड़ने के लायक है कि अंतर्निहित कारण यह है कि एक निजी कुंजी थी लेकिन कोई संबंधित प्रमाण पत्र नहीं था (यानी एक ही उपनाम के साथ), इसलिए 'प्रमाणपत्र पुनर्प्राप्ति' संदेशों से पूछे जाने पर जावा एक नहीं भेज सका। इसके अन्य कारणों में सर्वर निर्दिष्ट निर्दिष्ट जारीकर्ताओं द्वारा हस्ताक्षरित कोई प्रमाणपत्र शामिल नहीं हो सकता है, या सर्वर निर्दिष्ट सिफर से मेल खाने वाले प्रमाणपत्र नहीं हैं। – EJP

    +0

    हमने इस समस्या को हल किया है बस सर्वर द्वारा निर्दिष्ट सिफर से मेल खाते हैं। इस जानकारी के लिए धन्यवाद दोस्तों, यह बहुत उपयोगी था। –

    उत्तर

    76

    यह संभव है कि आपने इंटरस्टीडेट सीए प्रमाणपत्र को उस प्रविष्टि के साथ संबद्ध किए बिना कुंजीस्टोर में आयात किया हो, जहां आपके ग्राहक प्रमाण पत्र और उसकी निजी कुंजी हो। आपको keytool -v -list -keystore store.jks का उपयोग करके इसे देखने में सक्षम होना चाहिए। यदि आपको प्रति उपनाम प्रविष्टि केवल एक प्रमाण पत्र मिलता है, तो वे एक साथ नहीं हैं।

    आपको अपने प्रमाणपत्र और इसकी श्रृंखला को एक साथ कीस्टोर ऊर्फ में आयात करने की आवश्यकता होगी जिसमें आपकी निजी कुंजी हो।

    यह पता लगाने के लिए कि किस कीस्टोर ऊर्फ की निजी कुंजी है, keytool -list -keystore store.jks का उपयोग करें (मैं यहां जेकेएस स्टोर प्रकार मान रहा हूं)। यह आपको कुछ इस तरह बता देंगे:

    Your keystore contains 1 entry 
    
    myalias, Feb 15, 2012, PrivateKeyEntry, 
    Certificate fingerprint (MD5): xxxxxxxx 
    

    यहाँ, उर्फ ​​myalias है। यदि आप इसके अलावा -v का उपयोग करते हैं, तो आपको Alias Name: myalias देखना चाहिए।

    आप इसे अलग से पहले से ही नहीं है, तो, कीस्ट्रोक से अपने क्लाइंट प्रमाणपत्र निर्यात:

    keytool -exportcert -rfc -file clientcert.pem -keystore store.jks -alias myalias 
    

    यह आपको एक पीईएम फ़ाइल देना चाहिए।

    एक पाठ संपादक (या cat), फ़ाइल तैयार का उपयोग करना, कि क्लाइंट प्रमाणपत्र और इंटरमीडिएट CA प्रमाणपत्र (और संभवतः जड़ CA प्रमाणपत्र ही अगर आप चाहते हैं) के साथ इतना है कि क्लाइंट-प्रमाण पत्र है (यह bundle.pem कॉल) शुरुआत में और इसके जारीकर्ता प्रमाण बस के अधीन है।

    इस तरह दिखना चाहिए: उर्फ ​​जहां अपनी निजी कुंजी है में वापस एक साथ

    -----BEGIN CERTIFICATE----- 
    MIICajCCAdOgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJVSzEa 
    .... 
    -----END CERTIFICATE----- 
    -----BEGIN CERTIFICATE----- 
    MIICkjCCAfugAwIBAgIJAKm5bDEMxZd7MA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNV 
    .... 
    -----END CERTIFICATE----- 
    

    अब, आयात इस बंडल:

    keytool -importcert -keystore store.jks -alias myalias -file bundle.pem 
    
    +1

    थानक्स एक मिलियन ब्रूनो - जिसने नौकरी की। मुझे लगता है कि यह थोड़ा और दस्तावेज हो सकता है। मैंने बस यह पता लगाने की कोशिश कर कई दिनों बिताए कि क्या चल रहा है। जावा के संकेत व्यावहारिक रूप से अस्तित्व में थे। –

    +1

    मुझे भी आयात में एक प्रमाण पत्र और निजी कुंजी गठबंधन करने की आवश्यकता है, लेकिन मैं * .pem प्रमाणपत्र फ़ाइल से शुरू कर रहा हूं ("----- BEGIN प्रमाण पत्र -----") और * .key से शुरू होता है निजी कुंजी ("----- BEGIN आरएसए निजी कुंजी -----")। मैंने उन्हें संयोजित करने और फिर आयात करने की कोशिश की, लेकिन मुझे मिला: keytool त्रुटि: java.lang.Exception: इनपुट X.509 प्रमाणपत्र नहीं है। कोई विचार जहां मैं गलत जा रहा हूँ? मैंने http://stackoverflow.com/questions/5297867/ssl-tomcat-certificate-error/11984173#11984173 पर पढ़ा है जिसे कुंजी प्रकार pkcs12 में कनवर्ट करने की आवश्यकता हो सकती है। कोई विचार? मैं फँस गया हूँ! धन्यवाद। –

    +0

    धन्यवाद ब्रूनो, आपने मेरा दिन बचा लिया है !!! – Gaucho

    5

    के रूप में यहाँ एक ऐड, आप % उपयोग कर सकते हैं> openssl s_client-connect.example.com:443 कनेक्ट करें और डंप देखें और जांचें कि सभी मुख्य प्रमाणपत्र क्लाइंट के विरुद्ध मान्य है। आप इसे आउटपुट के नीचे देख रहे हैं। वापसी कोड सत्यापित करें: 0 (ठीक)

    जोड़ते हैं -showcerts यह कीचेन कि मेजबान प्रमाणपत्र था, जिसे आप अपने कीचेन में लोड है के साथ भेजा गया था की सभी जानकारी डंप हो जाएगा।

    +0

    आपने किस आदेश पर '-Showcerts' का उपयोग किया था? –

    +0

    @ जेरीलूक 'openssl s_client -showcerts -connect host.example.com: 443' – Sky

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