[java] जावा क्लाइंट में सर्वर के स्वयं-हस्ताक्षरित एसएसएल प्रमाणपत्र स्वीकार करें


Answers

मैंने इस समस्या का प्रमाण पत्र प्रदाता को दिया जो कि JDK 8u74 रूप में डिफ़ॉल्ट JVM विश्वसनीय होस्ट का हिस्सा नहीं है। प्रदाता www.identrust.com है , लेकिन वह डोमेन नहीं था जिसे मैं कनेक्ट करने का प्रयास कर रहा था। उस डोमेन को इस प्रदाता से अपना प्रमाण पत्र प्राप्त हुआ था। जेडीके / जेआरई में डिफ़ॉल्ट सूची द्वारा क्रॉस रूट कवर ट्रस्ट देखेंगे? - कुछ प्रविष्टियों को पढ़ें। यह भी देखें कि कौन से ब्राउज़र और ऑपरेटिंग सिस्टम चलो एन्क्रिप्ट करें

इसलिए, डोमेन से कनेक्ट करने के लिए मुझे दिलचस्पी थी, जिसमें identrust.com से जारी प्रमाणपत्र था, मैंने निम्नलिखित कदम उठाए। असल में, मुझे पहचानकर्ता.com ( DST Root CA X3 ) प्रमाणपत्र जेवीएम द्वारा भरोसा किया जाना था। मैं Apache HttpComponents 4.5 का उपयोग करके ऐसा करने में सक्षम था:

1: सर्टिफिकेट चेन डाउनलोड निर्देशों पर प्रमाण पत्र से प्रमाण पत्र प्राप्त करें। डीएसटी रूट सीए एक्स 3 लिंक पर क्लिक करें।

2: स्ट्रिंग को "डीएसटी रूट सीए X3.pem" नामक फ़ाइल में सहेजें। शुरुआत में और अंत में फ़ाइल में "----- BEGIN प्रमाण पत्र -----" और "----- अंत प्रमाण पत्र -----" पंक्तियों को जोड़ना सुनिश्चित करें।

3: निम्न कुंजी के साथ एक जावा कीस्टोर फ़ाइल, cacerts.jks बनाएँ:

keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword

4: परिणामस्वरूप cacerts.jks कीस्टोर को अपने जावा / (मेवेन) एप्लिकेशन की संसाधन निर्देशिका में कॉपी करें।

5: इस फ़ाइल को लोड करने के लिए निम्न कोड का प्रयोग करें और इसे Apache 4.5 HttpClient से संलग्न करें। यह उन सभी डोमेन के लिए समस्या का समाधान करेगा जिनके पास indetrust.com से जारी प्रमाणपत्र हैं, indetrust.com डिफ़ॉल्ट कीस्टोर में प्रमाणपत्र शामिल हैं।

SSLContext sslcontext = SSLContexts.custom()
        .loadTrustMaterial(new File(CalRestClient.class.getResource("/cacerts.jks").getFile()), "yourpasword".toCharArray(),
                new TrustSelfSignedStrategy())
        .build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
        sslcontext,
        new String[] { "TLSv1" },
        null,
        SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
        .setSSLSocketFactory(sslsf)
        .build();

जब प्रोजेक्ट बनाता है तो cacerts.jks को क्लासपाथ में कॉपी किया जाएगा और वहां से लोड किया जाएगा। मैंने इस समय, अन्य एसएसएल साइटों के खिलाफ परीक्षण नहीं किया था, लेकिन यदि उपरोक्त कोड इस प्रमाणपत्र में "चेन" है तो वे भी काम करेंगे, लेकिन फिर, मुझे नहीं पता।

संदर्भ: कस्टम एसएसएल संदर्भ और मैं जावा HttpsURL कनेक्शन के साथ एक स्व-हस्ताक्षरित प्रमाणपत्र कैसे स्वीकार करूं?

Question

यह एक मानक सवाल की तरह दिखता है, लेकिन मुझे कहीं भी स्पष्ट दिशा नहीं मिल सका।

मेरे पास जावा कोड संभवतया स्व-हस्ताक्षरित (या समाप्त हो गया) प्रमाणपत्र वाले सर्वर से कनेक्ट करने का प्रयास कर रहा है। कोड निम्न त्रुटि रिपोर्ट करता है:

[HttpMethodDirector] I/O exception (javax.net.ssl.SSLHandshakeException) caught 
when processing request: sun.security.validator.ValidatorException: PKIX path 
building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

जैसा कि मैं इसे समझता हूं, मुझे keytool का उपयोग करना है और जावा को यह कहना है कि इस कनेक्शन को अनुमति देना ठीक है।

इस समस्या को ठीक करने के लिए सभी निर्देश मानते हैं कि मैं कीटोल के साथ पूरी तरह से कुशल हूं, जैसे कि

सर्वर के लिए निजी कुंजी उत्पन्न करें और इसे कीस्टोर में आयात करें

क्या कोई ऐसा है जो विस्तृत निर्देश पोस्ट कर सकता है?

मैं यूनिक्स चला रहा हूं, इसलिए बैश स्क्रिप्ट सबसे अच्छा होगा।

सुनिश्चित नहीं है कि यह महत्वपूर्ण है, लेकिन कोड jboss में निष्पादित।




यदि 'वे' एक स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग कर रहे हैं तो उनके सर्वर को उपयोग करने योग्य बनाने के लिए आवश्यक कदम उठाने के लिए उन पर निर्भर है। विशेष रूप से इसका मतलब है कि वे आपके प्रमाण पत्र को विश्वसनीय तरीके से ऑफ़लाइन प्रदान करते हैं। तो उन्हें ऐसा करने के लिए मिलता है। फिर आप JSSE संदर्भ मार्गदर्शिका में वर्णित कीटोल का उपयोग करके अपने ट्रस्टस्टोर में आयात करते हैं। यहाँ पोस्ट असुरक्षित ट्रस्टमैनेजर के बारे में भी मत सोचो।

संपादित करें सत्रह (!) डाउनवॉटर के लाभ के लिए, और नीचे कई टिप्पणियां, जिन्होंने स्पष्ट रूप से जो कुछ भी लिखा है, उसे स्पष्ट रूप से नहीं पढ़ा है, यह स्व-हस्ताक्षरित प्रमाणपत्रों के खिलाफ एक जेरेमीयाड नहीं है। सही तरीके से कार्यान्वित होने पर स्व-हस्ताक्षरित प्रमाणपत्रों में कुछ भी गलत नहीं है लेकिन, उन्हें लागू करने का सही तरीका यह है कि प्रमाण पत्र को प्रमाणित करने के लिए उपयोग किए जा रहे अनधिकृत चैनल के माध्यम से ऑफ़लाइन प्रक्रिया के माध्यम से सुरक्षित रूप से वितरित किया जाना है। निश्चित रूप से यह स्पष्ट है? यह निश्चित रूप से हर सुरक्षा-जागरूक संगठन के लिए स्पष्ट है, मैंने कभी भी अपनी कंपनियों के लिए हजारों शाखाओं वाले बैंकों से काम किया है। सभी प्रमाण पत्रों पर भरोसा करने के क्लाइंट-साइड कोड-बेस 'समाधान', जिसमें किसी भी व्यक्ति द्वारा हस्ताक्षरित स्व-हस्ताक्षरित प्रमाणपत्र शामिल हैं, या कोई भी आर्बेटरी बॉडी स्वयं को सीए के रूप में स्थापित कर रहा है, वास्तव में सुरक्षित नहीं है। यह सिर्फ सुरक्षा में खेल रहा है। यह व्यर्थ है। आपके पास निजी, छेड़छाड़ करने वाला, उत्तर-प्रमाण, इंजेक्शन-सबूत वार्तालाप ... किसी के साथ है। कोई। बीच में एक आदमी। एक प्रतिरूपणकर्ता। कोई। आप सादे टेक्स्ट का भी उपयोग कर सकते हैं।




अपाचे एचटीपी क्लाइंट 4.5 स्व-हस्ताक्षरित प्रमाणपत्र स्वीकार करने का समर्थन करता है:

SSLContext sslContext = SSLContexts.custom()
    .loadTrustMaterial(new TrustSelfSignedStrategy())
    .build();
SSLConnectionSocketFactory socketFactory =
    new SSLConnectionSocketFactory(sslContext);
Registry<ConnectionSocketFactory> reg =
    RegistryBuilder.<ConnectionSocketFactory>create()
    .register("https", socketFactory)
    .build();
HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(reg);        
CloseableHttpClient httpClient = HttpClients.custom()
    .setConnectionManager(cm)
    .build();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse sslResponse = httpClient.execute(httpGet);

यह एक एसएसएल सॉकेट फैक्ट्री बनाता है जो TrustSelfSignedStrategy उपयोग करेगा, इसे कस्टम कनेक्शन मैनेजर के साथ पंजीकृत करता है, फिर उस कनेक्शन मैनेजर का उपयोग करके एक HTTP GET करता है।

मैं उन लोगों से सहमत हूं जो "उत्पादन में ऐसा नहीं करते हैं" का जप करते हैं, हालांकि उत्पादन के बाहर स्वयं हस्ताक्षरित प्रमाणपत्र स्वीकार करने के लिए उपयोग-मामले हैं; हम उन्हें स्वचालित एकीकरण परीक्षणों में उपयोग करते हैं, ताकि हम उत्पादन हार्डवेयर पर चलने पर भी SSL (उत्पादन में) का उपयोग कर रहे हों।




Links