मैं www.udemy.com (रीस्ट जावा वेब सर्विसेज) पर REST वेब सेवाओं के लिए एक ट्यूटोरियल पर काम कर रहा हूं। ट्यूटोरियल में उदाहरण में कहा गया है कि एसएसएल रखने के लिए, मेरे पास मेरे ग्रहण "क्लाइंट" प्रोजेक्ट में "ट्रस्ट_स्टोर" नामक एक फ़ोल्डर होना चाहिए जिसमें एक "कुंजी स्टोर" फ़ाइल होनी चाहिए (हमारे पास सेवा को कॉल करने के लिए "क्लाइंट" प्रोजेक्ट था , और "सेवा" परियोजना जिसमें REST वेब सेवा शामिल थी - एक ही कार्यक्षेत्र में 2 परियोजनाएँ, एक ग्राहक, दूसरी सेवा)। चीजों को सरल रखने के लिए, उन्होंने ग्लासफ़िश ऐप सर्वर से "keystore.jks" को कॉपी करने के लिए कहा (ग्लासफ़िश \ डोमेन \ domain1 \ config \ keystore.jks) जिसका हम उपयोग कर रहे हैं और इसे इस "ट्रस्ट_स्टोर" फ़ोल्डर में डाल दिया है, जो उन्होंने मुझे बनाया था। ग्राहक परियोजना। यह समझ में आता है: सर्वर में स्व-हस्ताक्षरित सेर्ट्स ' s key_store क्लाइंट ट्रस्ट_स्टोर में सीट्स के अनुरूप होगा। अब, यह करते हुए, मुझे यह त्रुटि मिल रही थी कि मूल पोस्ट में उल्लेख है। मैंने इसे गुगुल किया है और पढ़ा है कि क्लाइंट को एक विश्वसनीय / हस्ताक्षरित प्रमाण पत्र नहीं होने के कारण "keystore.jks" फ़ाइल के कारण है, जो यह प्रमाण पत्र पाता है कि वह स्व-हस्ताक्षरित है।
चीजों को स्पष्ट रखने के लिए, मुझे कहना चाहिए कि जैसा कि मैं समझता हूं, "कीस्टॉर.जक्स" में स्व-हस्ताक्षरित सीरट्स होते हैं, और "कैकटर.जक्स" फ़ाइल में सीए सीट्स (सीए द्वारा हस्ताक्षरित) होते हैं। "कीस्टोर.जक्स" "कीस्टोर" है और "कैसटर्स.जक्स" "ट्रस्ट स्टोर" है। जैसा कि "ब्रूनो", एक टिप्पणीकार, ऊपर कहता है, "keystore.jks" स्थानीय है, और "cacerts.jks" दूरस्थ ग्राहकों के लिए है।
तो, मैंने खुद से कहा, हे, ग्लासफिश के पास "cacerts.jks" फाइल भी है, जो ग्लासफिश की ट्रस्ट_स्टोर फाइल है। cacerts.jsk में CA प्रमाणपत्र शामिल हैं। और जाहिरा तौर पर मुझे एक मुख्य स्टोर फ़ाइल में मेरे Trust_store फ़ोल्डर की आवश्यकता है जिसमें कम से कम एक CA प्रमाणपत्र है। इसलिए, मैंने अपने ग्राहक प्रोजेक्ट पर "Trust_store" फ़ोल्डर में "cacerts.jks" फ़ाइल डालने की कोशिश की, और "कीस्टॉर .jks" के बजाय "cacerts.jks" को इंगित करने के लिए VM गुणों को बदल दिया। उस त्रुटि से छुटकारा मिल गया। मुझे लगता है कि काम करने के लिए सीए की जरूरत थी।
यह उत्पादन के लिए आदर्श नहीं हो सकता है, या यहां तक कि विकास के लिए भी कुछ काम करने से परे हो सकता है। उदाहरण के लिए, आप शायद क्लाइंट में "keystore.jks" फ़ाइल में CA certs जोड़ने के लिए "keytool" कमांड का उपयोग कर सकते हैं। लेकिन वैसे भी उम्मीद है कि यह कम से कम संभावित परिदृश्यों को कम कर देता है जो त्रुटि का कारण बनने के लिए यहां हो सकता है।
ALSO: क्लाइंट के लिए मेरा दृष्टिकोण उपयोगी लग रहा था (सर्वर सर्टिफिकेट क्लाइंट ट्रस्ट_स्टोर में जोड़ा गया), ऐसा लगता है कि मूल पोस्ट को हल करने के लिए उपरोक्त टिप्पणियां सर्वर के लिए उपयोगी हैं (क्लाइंट सर्टिफिकेट सर्वर ट्रस्ट_स्टोर में जोड़ा गया है)। चीयर्स।
ग्रहण परियोजना सेटअप:
- MyClientProject
- src
- परीक्षा
- JRE सिस्टम लाइब्रेरी
- ...
- Trust_store
--- cacerts.jks --- keystore.jks
MyClientProject.java फ़ाइल से स्निपेट:
static {
// Setup the trustStore location and password
System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
// comment out below line
System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
//System.setProperty("javax.net.debug", "all");
// for localhost testing only
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
return hostname.equals("localhost");
}
});
}