एक मॉड्यूल जो हम अपने बड़े जावा एप्लिकेशन में जोड़ रहे हैं, उसे किसी अन्य कंपनी की एसएसएल-सुरक्षित वेबसाइट के साथ जोड़ना है। समस्या यह है कि साइट एक स्व-हस्ताक्षरित प्रमाण पत्र का उपयोग करती है। मेरे पास यह प्रमाणित करने के लिए प्रमाण पत्र की एक प्रति है कि मैं एक आदमी के बीच के हमले का सामना नहीं कर रहा हूं, और मुझे इस कोड को इस तरह से हमारे कोड में शामिल करना होगा ताकि सर्वर से कनेक्शन सफल हो।
यहाँ मूल कोड है:
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();
}
स्व-हस्ताक्षरित प्रमाण पत्र के लिए किसी अतिरिक्त हैंडलिंग के बिना, यह निम्न अपवाद के साथ con.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
आदर्श रूप से, मेरे कोड को इस एक स्व-हस्ताक्षरित प्रमाण पत्र को स्वीकार करने के लिए जावा को सिखाना होगा, आवेदन में इस एक स्थान के लिए, और कहीं नहीं।
मुझे पता है कि मैं प्रमाण पत्र को JRE के प्रमाणपत्र प्राधिकरण स्टोर में आयात कर सकता हूं, और यह जावा को इसे स्वीकार करने की अनुमति देगा। अगर मैं मदद कर सकता हूं तो मैं ऐसा दृष्टिकोण नहीं लेना चाहता हूं; यह हमारे ग्राहक की सभी मशीनों पर एक मॉड्यूल के लिए बहुत आक्रामक लगता है जिसका वे उपयोग नहीं कर सकते हैं; यह एक ही JRE का उपयोग करके अन्य सभी जावा अनुप्रयोगों को प्रभावित करेगा, और मुझे यह पसंद नहीं है, भले ही इस साइट तक पहुंचने वाले किसी भी अन्य जावा अनुप्रयोग की संभावनाएं शून्य हैं। यह एक तुच्छ कार्रवाई नहीं है: यूनिक्स पर मुझे इस तरह से जेआरई को संशोधित करने के लिए एक्सेस अधिकार प्राप्त करने हैं।
मैंने यह भी देखा है कि मैं एक TrustManager उदाहरण बना सकता हूँ जो कुछ कस्टम जाँच करता है। ऐसा लगता है कि मैं भी एक TrustManager बनाने में सक्षम हो सकता है जो इस एक प्रमाण पत्र को छोड़कर सभी उदाहरणों में वास्तविक TrustManager को दर्शाता है। लेकिन ऐसा लगता है कि TrustManager विश्व स्तर पर स्थापित हो जाता है, और मुझे लगता है कि हमारे आवेदन से अन्य सभी कनेक्शन प्रभावित होंगे, और यह मेरे लिए बहुत सही गंध नहीं करता है, या तो।
स्व-हस्ताक्षरित प्रमाणपत्र को स्वीकार करने के लिए जावा एप्लिकेशन सेट करने के लिए पसंदीदा, मानक या सबसे अच्छा तरीका क्या है? क्या मैं उपरोक्त सभी लक्ष्यों को पूरा कर सकता हूं, या क्या मुझे समझौता करना होगा? क्या फ़ाइलों और निर्देशिकाओं और कॉन्फ़िगरेशन सेटिंग्स और थोड़ा-से-कोड शामिल करने का विकल्प है?