2009-05-06 7 views
7

मैं जावा कोड में एक सुरक्षित (यानी SSL) वेब पेज से पढ़ने की कोशिश कर रहा हूं। मैं URLConnection (java.net) और अपाचे के HTTP क्लाइंट दोनों का उपयोग करने का प्रयास कर रहा हूं।जावा में एसएसएल साइट को प्रमाणीकृत करने में असमर्थ: "pathLenConstraint उल्लंघन - यह प्रमाणपत्र प्रमाणन पथ में अंतिम प्रमाणपत्र होना चाहिए"

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX पथ सत्यापन विफल: java.security दोनों ही मामलों में, जब मैं अनुरोध करना, मैं इस अपवाद मिलता है। cert.CertPathValidatorException: बुनियादी कमी की जांच विफल: pathLenConstraint का उल्लंघन किया - इस प्रमाणपत्र com.sun.net.ssl.internal.ssl.Alerts.getSSLException पर प्रमाणीकरण पथ का अंतिम प्रमाणपत्र होना चाहिए (Alerts.java:150) com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal (SSLSock etImpl.java:1518) com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:174) com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:168) com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:848) पर com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage पर (ClientHandshaker.java:106) com.sun.net.ssl.internal.ssl.Handshaker.processLoop (Handshaker.java:495) com.sun.net.ssl.internal.ssl.Handshaker.process_record पर पर (हैंडशेकर.जावाश्र 33) com.sun.net.ssl.internal.ssl.SSLSocketIm पर pl.readRecord (SSLSocketImpl.java:818) com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1030) com.sun.net.ssl.internal.ssl पर पर। SSLSocketImpl.startHandshake (SSLSocketImpl.java:1057) com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1041) पर sun.net.www.protocol.https.HttpsClient पर। afterConnect (HttpsClient.java:402) sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect (AbstractDelegateHttpsURLConnection.java:166) sun.net.www.protocol.http.HttpURLConnection.getInputStream पर (HttpURLConnection पर। जावा: 9 34) sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream पर (HttpsURLConnectionImpl.java:234) com.sap.river.coghead.rest.Main.testJavaHTTPConnection (Main.java:45) पर पर कॉम sun.security.validator.ValidatorException: PKIX पथ सत्यापन विफल: java.security.cert.CertPathValidatorException: बुनियादी कमी .sap.river.coghead.rest.Main.main (Main.java:32) की वजह से चेक विफल: pathLenConstraint उल्लंघन - यह प्रमाणपत्र प्रमाणन पथ sun.security.validator.PKIXValidator.doValidate (PKIXValida) पर अंतिम प्रमाणपत्र होना चाहिए tor.java:187) sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:139) sun.security.validator.Validator.validate (Validator.java:203 पर) com.sun पर पर .net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:172) com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted (SSLContextImpl।जावा: java.security.cert.CertPathValidatorException: बुनियादी कमी 320) com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:841) ... कम से 13 से अधिक की वजह से जांच में विफल: pathLenConstraint का उल्लंघन किया - इस प्रमाणपत्र sun.security.provider.certpath.PKIXMasterCertPathValidator.validate (PKIXMasterCertPathValidator.java:139) पर प्रमाणीकरण पथ का अंतिम प्रमाणपत्र होना चाहिए sun.security.provider.certpath पर .PKIXCertPathValidator.doValidate (PKIXCertPathValidator.java:316) sun.security.provider.certpath.PKIXCertPathValidator.engineValidate (PKIXCert PathValidator.java:178) java.security.cert.CertPathValidator.validate (CertPathValidator.java:206) पर sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:182 पर) ... 18 अधिक

ध्यान दें कि मैं एक अलग मेजबान के लिए एक गैर-एसएसएल कनेक्शन स्थापित करने में सफल रहा हूं। मैं ब्राउज़र का उपयोग करके इस पृष्ठ को देखने में भी सक्षम हूं - प्रमाण पत्र सही तरीके से मान्य हैं।

क्या आपको किसी भी तरह से प्रमाण पत्र के क्रम को बदलने की आवश्यकता है क्योंकि उन्हें सर्वर से पुनर्प्राप्त किया गया है? क्या कुछ विन्यास है जो मुझे याद आ रही है?

अग्रिम धन्यवाद,

लियोर

उत्तर

6

मैं आगे में खोदा और जवाब तथ्य यह है कि मैं JVM द्वारा उपयोग किया गया SSL प्रमाणित करने के लिए कुंजी संग्रह में आवश्यक प्रमाण पत्र आयात करने के लिए की जरूरत में निहित है। कुंजी स्टोर प्रोग्राम चलाने के लिए उपयोग किए जाने वाले जेआर में जेआर/lib/सुरक्षा फ़ोल्डर के तहत 'cacerts' फ़ाइल है।

मैंने मैन्युअल रूप से साइट के प्रमाण पत्र निर्यात किए - वे सभी।
फिर मैंने इसे सूर्य द्वारा प्रदान की गई 'कीटोल' उपयोगिता का उपयोग करके अपने डिफ़ॉल्ट कीस्टोर में आयात किया। ध्यान दें कि आपको उन्हें सही क्रम में आयात करना होगा।
फिर मैंने जेआरई के बजाय नई कीस्टोर डाल दी - और यह काम किया।

मुझे लगता है कि सीधे जेआरई की कीस्टोर में प्रमाण पत्र आयात करना बेहतर होगा, लेकिन उपकरण ने मुझे एक पासवर्ड के लिए कहा जो मुझे नहीं पता था।

मेरा मानना ​​है कि इस और अधिक आसानी से प्रोग्राम करने का एक तरीका भी है, अभी तक इसे अभी तक नहीं मिला है। मुझे कुछ पॉइंटर्स प्राप्त करने में खुशी होगी (जेएसएसई में ट्रस्टमैनेजर क्लास?)।

अंत में, कुछ क्रेडिट। यह पोस्ट यहां: http://javaishdiscoveries.blogspot.com/2009/02/battle-with-cacerts-and-https.html ने मुझे सही दिशा में इंगित करने में मदद की।

+0

अगर यह मदद करता है मैं नहीं जानता था, लेकिन जावा आप डिफ़ॉल्ट SLLSocketFactory बदलने के लिए अनुमति देता है। – Powerlord

+0

हाँ, मुझे कल्पना है कि मुझे उस क्षेत्र में कुछ करने की ज़रूरत है। बस इसे और जांच करने की जरूरत है। वैसे भी, - लियोर – Lior

+2

एफवाईआई, डिफ़ॉल्ट जावा प्रमाणपत्र के लिए पासवर्ड कीस्टोर $ JAVA_HOME/lib/security/cacerts 'changeit' –

0

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX पथ सत्यापन विफल: java.security.cert।CertPathValidatorException: बुनियादी बाधाओं में विफल रहा है की जाँच करें: pathLenConstraint का उल्लंघन किया - इस प्रमाणपत्र

http://groups.google.com/group/google-checkout-developers-forum/web/google-checkout-and-ssl-certificates?version=49

में कम से

pathLenConstraint

देखें (प्रमाणपत्र चेन के बारे में नोट) प्रमाणीकरण पथ का अंतिम प्रमाणपत्र होना चाहिए गूगल कहता है कि यह सर्टिफिकेट चेन ऑर्डर के साथ समस्या हो सकती है, मैंने अभी पाया है कि मेरा प्रमाण क्रम में नहीं है, अभी तक तय नहीं है, इस पर काम कर रहा है। मैं इसे बाद में अपडेट करूंगा।


पुराने पोस्ट:

लगभग एक ही समस्या है।

कीस्टोर में प्रमाणपत्र मैनुअल जोड़ना मदद करता है, लेकिन मैं अपने क्लाइंट के साथ इसे और अधिक स्वचालित रूप से करना पसंद करूंगा।

तो मेरी समाधान:

मैं कुंजीस्टोर सिर्फ इस एक अनुप्रयोग के लिए उपयोग करेगा, और एक मेजबान 1. कुंजीस्टोर मौजूद नहीं है - कुछ जनरेट किए गए पासवर्ड के साथ कॉन्फ़िग फ़ाइल में पासवर्ड सेव 2. बनाने 3. पूछना उपयोगकर्ता (या नहीं) क्या वह इस प्रमाणपत्र को स्वीकार करना चाहता है 4. यदि ऐसा है - इसे कुंजीस्टोर पर सहेजें, और इसकी आवश्यकता होने पर इसका उपयोग करें

क्या यह एक अच्छा समाधान है? कोई टिप्पणी?

0

समस्या प्रमाणपत्र श्रृंखला आदेश के साथ थी। यह था: ए-> सी-> बी, लेकिन ए-> बी-> सी होना चाहिए, एक बार जब हमने चेन ऑर्डर तय किया तो एप्लिकेशन काम करना शुरू कर दिया।


मैंने व्यक्तिगत रूप से अलर्ट तय किए हैं। लेकिन इस पोस्ट उपयोगी

http://groups.google.com/group/google-checkout-api-troubleshooting/browse_thread/thread/99862c11d37d3127

+3

आपने प्रमाणपत्रों के श्रृंखला आदेश को कैसे पाया? – sbidwai