2012-07-31 17 views
17

मैं अपने एपीआई यूआरएल में से एक को मतदान करने के लिए एक साधारण ऐप मॉनीटर का निर्माण कर रहा हूं और हमें ईमेल कर सकता हूं अगर इसे प्रतिक्रिया से HTTP 200 स्टेटस कोड नहीं मिल रहा है (यह हमारे एपीआई को इंगित करेगा किसी कारण से नीचे है)।एसएसएल "पीयर नहीं प्रमाणीकृत" त्रुटि HttpClient 4.1

मैं उपयोग कर रहा हूँ HttpClient 4.1 (यह महत्वपूर्ण है क्योंकि इसके एपीआई 3.x से बहुतअलग है)।

हमारे एपीआई तथापि में प्रवेश, एसएसएल के साथ सुरक्षित है: एक वेब ब्राउज़र में

http://example.com/our-api

https://example.com/our-api

को रीडायरेक्ट किसी भी पैदा करने के बिना त्रुटियों। प्रमाणीकृत नहीं

मैं इस अन्य लोगों के लिए एक बहुत हो रहा देखना

सहकर्मी:

जब HttpClient इस URL (http://example.com/our-api) हिट करने के लिए प्रयास करता है, यह बताते हुए एक संदेश के साथ एक javax.net.ssl.SSLPeerUnverifiedException अपवाद के साथ विफल रहता है जैसा कि this पोस्ट से प्रमाणित है (जो इस समस्या को रोकने के कुछ तरीके भी प्रदान करता है - एक समाधान जिसे मैं वास्तव में आज रात कोशिश करने और लागू करने जा रहा हूं)।

यह अन्य पोस्ट (और इसके समान अन्य) क्या नहीं करते हैं यह समझाता है कि यह पहली जगह क्यों हो रहा है! तो, पूछने के बजाय "मैं इसे कैसे ठीक करूं?" मैं सोचा मैं पूछना होगा "क्यों हो रहा है?" इससे पहले कि मैं प्रस्तावित समाधानों में से एक के साथ आगे barging जाओ, मैं पता है कि समस्या यह है कि मैं ;-)

+1

आप पूर्ण स्टैक ट्रेस पोस्ट कर सकते हैं? –

+0

यह ध्यान दिया जाना चाहिए कि यह संदेश HttpClient में अजीब प्रोग्रामिंग के कारण होना चाहिए। एक पूर्व एसएसईएलएक्सप्शन 'हैंडशेक विफलता' होती, और यही वह था जिसे फेंक दिया जाना चाहिए था। स्पष्ट रूप से निष्पादन एक SSLSession.getPeerCertificate() कॉल जारी रहा, जो एकमात्र एपीआई है जो शीर्षक में अपवाद फेंकता है। – EJP

उत्तर

24

ठीक करने का प्रयास कर रहा हूँ है करना चाहते हैं यदि सर्वर का प्रमाणपत्र स्वयं हस्ताक्षरित है, तो यह डिज़ाइन के रूप में काम कर रहा है और आपको सर्वर के प्रमाणपत्र को अपने कीस्टोर में आयात करना होगा।

मान लें कि सर्वर प्रमाण पत्र एक प्रसिद्ध सीए द्वारा हस्ताक्षरित है, ऐसा इसलिए हो रहा है क्योंकि आधुनिक ब्राउज़र में उपलब्ध सीए प्रमाणपत्रों का सेट जेडीके/जेआरई के साथ भेजे गए सीमित सेट से काफी बड़ा है।

आपके द्वारा उल्लिखित पदों में से एक में दिए गए EasySSL समाधान में त्रुटि आती है, और आपको पता नहीं होगा कि सर्वर का वैध प्रमाणपत्र है या नहीं।

प्रमाण पत्र को सत्यापित करने के लिए आपको अपने कुंजीस्टोर में उचित रूट CA आयात करना होगा। एक कारण है कि आप स्टॉक एसएसएल कोड के साथ इस बारे में नहीं मिल सकते हैं, और यह उन प्रोग्रामों को लिखने से रोकने के लिए है जो व्यवहार करते हैं जैसे कि वे सुरक्षित हैं लेकिन नहीं हैं।

+0

अधिकांश समय एसएसएल सर्वर श्रृंखला को भेज देगा लेकिन रूट प्रमाणपत्र सहित नहीं। तो ज्यादातर समय आपको पूरी श्रृंखला को कीस्टोर में आयात नहीं करना पड़ेगा। हालांकि आपको रूट प्रमाणपत्र पर स्पष्ट रूप से भरोसा करना चाहिए। –

+0

@owlstead हां, आमतौर पर आपको केवल रूट सीए आयात करने की आवश्यकता होती है; जवाब संपादित किया गया। –

+0

मैंने 'lib \ security \ cacerts' के अंतर्गत कुंजी स्टोर में प्रमाणपत्र (बेस 64 संस्करण) आयात किया लेकिन जावा अभी भी एक ही त्रुटि देता है। जब मैंने इसे विंडोज भरोसेमंद प्रमाणपत्र स्टोर में आयात किया, तो क्रोम त्रुटियों को रोकना बंद कर दिया। लेकिन जब मैंने जावा कीटोल के साथ किया तो यह अभी भी कनेक्ट नहीं हो सकता है। – nurettin

6

यह फेंक दिया जाता है जब

... सहकर्मी ही (उदाहरण के लिए पहचान करने में सक्षम नहीं था, कोई प्रमाण पत्र, विशेष रूप से सिफ़र सुइट प्रमाणीकरण का समर्थन नहीं करता इस्तेमाल किया जा रहा है, या कोई सहकर्मी प्रमाणीकरण था एसएसएल हैंडशेकिंग के दौरान स्थापित) यह अपवाद फेंक दिया गया है।

शायद इस अपवाद का कारण (जहां स्टैकट्रैक है) आपको दिखाएगा कि यह अपवाद क्यों फेंक दिया गया है। संभवतः जावा के साथ भेजे गए डिफ़ॉल्ट कीस्टोर में टीटीपी के मूल प्रमाणपत्र (और ट्रस्ट) का उपयोग नहीं किया जा रहा है।

उत्तर रूट प्रमाणपत्र (उदा। अपने ब्राउज़र एसएसएल कनेक्शन से) को पुनर्प्राप्त करना है, इसे cacerts फ़ाइल में आयात करें और keytool का उपयोग करके इसे विश्वसनीय करें जिसे जावा जेडीके द्वारा भेजा जाता है। अन्यथा आपको प्रोग्रामेटिक रूप से एक और ट्रस्ट स्टोर असाइन करना होगा।

0

मैं जावा डेवलपर नहीं हूं लेकिन एक रीस्टफुल एपीआई का परीक्षण करने के लिए जावा ऐप का उपयोग कर रहा था। त्रुटि को ठीक करने के लिए मुझे त्रुटि को दूर करने के लिए वेबसर्वर में इंटरमीडिएट प्रमाणपत्र स्थापित करना पड़ा। मैं lighttpd का उपयोग कर रहा था, मूल प्रमाणपत्र एक आईआईएस सर्वर पर स्थापित किया गया था। आशा करता हूँ की ये काम करेगा। ये वे प्रमाण पत्र थे जिन्हें मैं सर्वर पर लापता था।

  • CA.crt
  • UTNAddTrustServer_CA.crt
  • AddTrustExternalCARoot.crt
0
keytool -import -v -alias cacerts -keystore cacerts.jks -storepass changeit -file C:\cacerts.cer