अंत में सभी मुद्दों को हल करने में कामयाब रहे, इसलिए मैं अपने सवाल का जवाब दूंगा। ये वे सेटिंग / फाइलें हैं जिनका उपयोग मैंने अपनी विशेष समस्या (ओं) को हल करने के लिए किया है;
ग्राहक की कुंजीस्टोर एक है PKCS # 12 प्रारूप वाली फ़ाइल
- ग्राहक का सार्वजनिक प्रमाण पत्र (इस उदाहरण में एक स्व-हस्ताक्षरित सीए द्वारा हस्ताक्षरित)
- ग्राहक की निजी कुंजी
इसे उत्पन्न करने के लिए मैंने ओपनएसएसएल की pkcs12
कमांड का उपयोग किया , उदाहरण के लिए;
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name "Whatever"
युक्ति: सुनिश्चित करें कि आपको नवीनतम OpenSSL मिलता है, संस्करण 0.9.8h नहीं , क्योंकि यह एक बग से पीड़ित लगता है जो आपको PKCS # 12 फ़ाइलों को ठीक से उत्पन्न करने की अनुमति नहीं देता है।
इस PKCS # 12 फ़ाइल का उपयोग जावा क्लाइंट द्वारा क्लाइंट सर्टिफिकेट को सर्वर में प्रस्तुत करने के लिए किया जाएगा जब सर्वर ने स्पष्ट रूप से क्लाइंट को प्रमाणित करने का अनुरोध किया हो। टीएलएस पर विकिपीडिया लेख देखें कि ग्राहक प्रमाण पत्र प्रमाणीकरण के लिए प्रोटोकॉल वास्तव में कैसे काम करता है (यह भी बताता है कि हमें ग्राहक की निजी वेबसाइट की आवश्यकता क्यों है)।
ग्राहक की truststore एक सीधे आगे है JKS प्रारूप युक्त फ़ाइल जड़ या मध्यवर्ती CA प्रमाणपत्र । ये CA प्रमाण पत्र निर्धारित करेंगे कि आपको किस एंडपॉइंट के साथ संवाद करने की अनुमति होगी, इस मामले में यह आपके ग्राहक को सर्वर से कनेक्ट करने की अनुमति देगा जो कि एक प्रमाण पत्र प्रस्तुत करता है जो ट्रस्टस्टोर के सीए में से एक द्वारा हस्ताक्षरित था।
इसे उत्पन्न करने के लिए आप मानक जावा कीटूल का उपयोग कर सकते हैं, उदाहरण के लिए;
keytool -genkey -dname "cn=CLIENT" -alias truststorekey -keyalg RSA -keystore ./client-truststore.jks -keypass whatever -storepass whatever
keytool -import -keystore ./client-truststore.jks -file myca.crt -alias myca
इस ट्रस्टस्टोर का उपयोग करते हुए, आपका क्लाइंट उन सभी सर्वरों के साथ पूर्ण एसएसएल हैंडशेक करने की कोशिश करेगा, जो पहचान किए गए सीए द्वारा हस्ताक्षरित प्रमाणपत्र प्रस्तुत करते हैं myca.crt
।
उपरोक्त फ़ाइलें केवल क्लाइंट के लिए कड़ाई से हैं। जब आप किसी सर्वर को सेट-अप करना चाहते हैं, तो सर्वर को अपनी कुंजी- और ट्रस्टस्टोर फ़ाइलों की आवश्यकता होती है। एक जावा क्लाइंट और सर्वर (टॉमकैट का उपयोग करके) दोनों के लिए एक पूरी तरह से काम करने वाले उदाहरण को स्थापित करने के लिए इस वेबसाइट पर पाया जा सकता है ।
मुद्दों / टिप्पणियां / सुझाव
- क्लाइंट प्रमाणपत्र प्रमाणीकरण केवल सर्वर द्वारा लागू किया जा सकता है।
- ( महत्वपूर्ण! ) जब सर्वर क्लाइंट प्रमाणपत्र (टीएलएस हैंडशेक के हिस्से के रूप में) का अनुरोध करता है, तो यह विश्वसनीय सीए की प्रमाण पत्र अनुरोध के हिस्से के रूप में एक सूची भी प्रदान करेगा। जब ग्राहक प्रमाणपत्र आप प्रमाणीकरण के लिए प्रस्तुत करना चाहते हैं , तो उनमें से एक सीए द्वारा हस्ताक्षरित नहीं किया जाता है, यह बिल्कुल भी प्रस्तुत नहीं किया जाएगा (मेरी राय में, यह अजीब व्यवहार है, लेकिन मुझे यकीन है कि इसके लिए एक कारण है)। यह मेरे मुद्दों का मुख्य कारण था, क्योंकि दूसरे पक्ष ने मेरे स्व-हस्ताक्षरित ग्राहक प्रमाणपत्र को स्वीकार करने के लिए अपने सर्वर को ठीक से कॉन्फ़िगर नहीं किया था और हमने यह मान लिया था कि अनुरोध में क्लाइंट प्रमाण पत्र को ठीक से उपलब्ध नहीं कराने के लिए समस्या मेरे अंत में थी।
- विरेचक हो जाओ। इसमें महान एसएसएल / एचटीटीपीएस पैकेट विश्लेषण है और यह डिबगिंग और समस्या का पता लगाने में काफी मदद करेगा। यह के समान है
-Djavax.net.debug=ssl
लेकिन अधिक संरचित है और (बेशक) व्याख्या करने के लिए यदि आप जावा एसएसएल डिबग आउटपुट के साथ असहज कर रहे हैं आसान।
यह अपाचे httpclient पुस्तकालय का उपयोग करने के लिए पूरी तरह से संभव है। यदि आप httpclient का उपयोग करना चाहते हैं, तो बस गंतव्य URL को HTTPS समकक्ष के साथ बदलें और निम्न JVM तर्क जोड़ें (जो किसी भी अन्य क्लाइंट के लिए समान हैं, चाहे आप उस लाइब्रेरी / वेबसाइट पर जो HTTP / HTTPS पर डेटा भेजने / प्राप्त करने के लिए उपयोग करना चाहते हैं) :
-Djavax.net.debug=ssl
-Djavax.net.ssl.keyStoreType=pkcs12
-Djavax.net.ssl.keyStore=client.p12
-Djavax.net.ssl.keyStorePassword=whatever
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.trustStore=client-truststore.jks
-Djavax.net.ssl.trustStorePassword=whatever