एक मॉड्यूल जो मैं अपने बड़े जावा एप्लिकेशन में जोड़ रहा हूं उसे किसी अन्य कंपनी की एसएसएल-सुरक्षित वेबसाइट के साथ बातचीत करना है। समस्या यह है कि साइट एक स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग करती है। मेरे पास यह प्रमाणित करने के लिए प्रमाण पत्र की एक प्रति है कि मुझे मैन-इन-द-बीच हमले का सामना नहीं करना पड़ रहा है, और मुझे इस प्रमाणपत्र को हमारे कोड में इस तरह से शामिल करने की आवश्यकता है कि सर्वर से कनेक्शन सफल रहेगा।मैं विशिष्ट कनेक्शन पर विभिन्न प्रमाणपत्रों का उपयोग कैसे कर सकता हूं?
यहाँ बुनियादी कोड है:
void sendRequest(String dataPacket) {
String urlStr = "https://host.example.com/";
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setMethod("POST");
conn.setRequestProperty("Content-Length", data.length());
conn.setDoOutput(true);
OutputStreamWriter o = new OutputStreamWriter(conn.getOutputStream());
o.write(data);
o.flush();
}
स्व-हस्ताक्षरित प्रमाणपत्र के लिए जगह में किसी भी अतिरिक्त हैंडलिंग बिना, इस निम्न अपवादों के साथ conn.getOutputStream() में मर जाता है:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
....
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
....
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
आदर्श रूप में , मेरे कोड को इस एक स्व-हस्ताक्षरित प्रमाण पत्र को स्वीकार करने के लिए जावा को सिखाने की जरूरत है, एप्लिकेशन में इस स्थान के लिए, और कहीं और नहीं।
मुझे पता है कि मैं जेआरई के प्रमाणपत्र प्राधिकरण स्टोर में प्रमाणपत्र आयात कर सकता हूं, और इससे जावा इसे स्वीकार करने की अनुमति देगा। यह एक दृष्टिकोण नहीं है जिसे मैं लेना चाहता हूं यदि मैं मदद कर सकता हूं; ऐसा लगता है कि हमारे सभी ग्राहक की मशीनों पर एक मॉड्यूल के लिए बहुत आक्रामक लगता है, जिसका उपयोग नहीं हो सकता है; यह एक ही जेआरई का उपयोग कर अन्य सभी जावा अनुप्रयोगों को प्रभावित करेगा, और मुझे यह पसंद नहीं है भले ही इस साइट तक पहुंचने वाले किसी भी अन्य जावा एप्लिकेशन की बाधाएं शून्य हों। यह एक मामूली ऑपरेशन भी नहीं है: यूनिक्स पर मुझे इस तरह जेआरई को संशोधित करने के लिए एक्सेस अधिकार प्राप्त करना होगा।
मैंने यह भी देखा है कि मैं एक ट्रस्टमैनेजर उदाहरण बना सकता हूं जो कुछ कस्टम जांच करता है। ऐसा लगता है कि मैं एक ट्रस्टमैनेजर भी तैयार कर सकता हूं जो इस प्रमाण पत्र को छोड़कर सभी मामलों में असली ट्रस्टमैनेजर को प्रतिनिधि करता है। लेकिन ऐसा लगता है कि ट्रस्टमैनेजर वैश्विक रूप से स्थापित हो जाता है, और मुझे लगता है कि हमारे आवेदन से अन्य सभी कनेक्शन प्रभावित होंगे, और यह मेरे लिए बिल्कुल सही गंध नहीं करता है।
एक स्व-हस्ताक्षरित प्रमाणपत्र स्वीकार करने के लिए जावा एप्लिकेशन सेट अप करने के लिए पसंदीदा, मानक या सर्वोत्तम तरीका क्या है? क्या मैं ऊपर दिए गए सभी लक्ष्यों को पूरा कर सकता हूं, या क्या मुझे समझौता करना होगा? क्या फाइलों और निर्देशिकाओं और कॉन्फ़िगरेशन सेटिंग्स, और कम-से-कम कोड शामिल करने का कोई विकल्प है?
छोटा, काम करने वाला फ़िक्स: http://www.rgagnon.com/javadetails/java-fix-certificate-problem-in-HTTPS।एचटीएमएल –
@ हसनप्रिएस्टर: कृपया इस पृष्ठ का सुझाव न दें। यह सभी ट्रस्ट सत्यापन अक्षम करता है। आप केवल अपने द्वारा हस्ताक्षरित स्व-हस्ताक्षरित प्रमाणपत्र को स्वीकार नहीं करेंगे, आप किसी भी प्रमाण पत्र को स्वीकार करने वाले भी हैं जो एमआईटीएम हमलावर आपको पेश करेगा। – Bruno