2012-03-06 5 views
28
public HttpClientVM() { 

    BasicHttpParams params = new BasicHttpParams(); 
    ConnManagerParams.setMaxTotalConnections(params, 10); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
    HttpProtocolParams.setUseExpectContinue(params, false); 
    HttpConnectionParams.setStaleCheckingEnabled(params, true); 
    HttpConnectionParams.setConnectionTimeout(params, 30000); 
    HostnameVerifier hostnameVerifier= 
      org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; 
    HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); 
    SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); 
    socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); 
    SchemeRegistry schemeRegistry = new SchemeRegistry(); 
    schemeRegistry.register(new Scheme("http",socketFactory, 80)); 
    schemeRegistry.register(new Scheme("https",socketFactory, 443)); 
     ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, schemeRegistry); 
     // Set verifier  
     client = new DefaultHttpClient(manager, params);  
    } 

Window7, HttpClient4अपवाद: javax.net.ssl.SSLPeerUnverifiedException: प्रमाणीकृत नहीं सहकर्मी

जब निष्पादित: client.accessURL(url); यह होता है:

Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 
    at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352) 
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128) 
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:397) 
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:495) 
    at org.apache.http.conn.scheme.SchemeSocketFactoryAdaptor.connectSocket(SchemeSocketFactoryAdaptor.java:62) 
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148) 
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:150) 
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121) 
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:575) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732) 

उत्तर

8

यह त्रुटि इसलिए है क्योंकि आपके सर्वर के पास वैध SSL प्रमाणपत्र नहीं है। इसलिए हमें क्लाइंट को एक अलग ट्रस्टमैनेजर का उपयोग करने की आवश्यकता है। यहां एक नमूना कोड है:

SSLContext ctx = SSLContext.getInstance("TLS"); 
X509TrustManager tm = new X509TrustManager() { 

    public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException { 
    } 

    public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException { 
    } 

    public X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 
}; 
ctx.init(null, new TrustManager[]{tm}, null); 
SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
ClientConnectionManager ccm = base.getConnectionManager(); 
SchemeRegistry sr = ccm.getSchemeRegistry(); 
sr.register(new Scheme("https", 443, ssf)); 

client = new DefaultHttpClient(ccm, base.getParams()); 
+5

इस अंत से सुरक्षा को हटाने से दूसरी तरफ समस्या हल हो जाएगी? वह ट्रस्टमैनेजर कोड विनिर्देश के अनुरूप भी नहीं है। – EJP

+0

मुझे आपका अंक नहीं दिख रहा है। समस्या ग्राहक पक्ष से आती है, इसलिए हमें केवल इसे बदलने की जरूरत है। कौन सा ट्रस्टमैनेजर कोड लाइन विनिर्देश का पालन नहीं करती है? – bnguyen82

+5

'getAcceptedIssuers()' निर्दिष्ट नहीं है कि कभी वापस शून्य न हो। आपके द्वारा पोस्ट किया गया कोड मूल रूप से असुरक्षित है। यह किसी भी समस्या का समाधान नहीं करता है, यह सिर्फ एक और समस्या पैदा करता है, उदाहरण के लिए मैन-इन-द-बीच हमलों के लिए भेद्यता। – EJP

14

समय सीमा समाप्त प्रमाण पत्र हमारे का कारण था "javax.net.ssl.SSLPeerUnverifiedException: प्रमाणीकृत नहीं सहकर्मी"।

Keytool -List -v -keystore filetruststore.ts

Enter keystore password: 
    Keystore type: JKS 
    Keystore provider: SUN 
    Your keystore contains 1 entry 
    Alias name: somealias 
    Creation date: Jul 26, 2012 
    Entry type: PrivateKeyEntry 
    Certificate chain length: 1 
    Certificate[1]: 
    Owner: CN=Unknown, OU=SomeOU, O="Some Company, Inc.", L=SomeCity, ST=GA, C=US 
    Issuer: CN=Unknown, OU=SomeOU, O=Some Company, Inc.", L=SomeCity, ST=GA, C=US 
    Serial number: 5011a47b 
    Valid from: Thu Jul 26 16:11:39 EDT 2012 until: Wed Oct 24 16:11:39 EDT 2012 
+0

"गूंगा" प्रश्न क्षमा करें, लेकिन समाप्त हो गया प्रमाणपत्र सर्वर पक्ष या ग्राहक पक्ष पर था? – isapir

+0

@Igal अगर मुझे सटीक रूप से याद है, सर्वर पक्ष। – buzz3791

1

यह भी आप पर कनेक्ट करने के लिए HTTPS का प्रयास कर रहे हैं और सर्वर ठीक SSL कनेक्शन संभालने के लिए तैयार नहीं है, तो हो सकता है।

मैं आपके एप्लिकेशन सर्वर एसएसएल सेटिंग्स की जांच करता हूं और सुनिश्चित करता हूं कि प्रमाणीकरण सही तरीके से कॉन्फ़िगर किया गया है।

+1

क्या गलत कॉन्फ़िगर किया जा सकता है? एसएसएल प्रमाणपत्र ब्राउज़र में ठीक काम करता है। यह जावा के साथ क्यों काम नहीं करता है? जावा इतना खास क्यों है? –

-5

यदि आप वैध प्रमाण पत्र के साथ देव मोड में हैं, तो क्यों न केवल weClient.setUseInsecureSSL(true) सेट करें। मेरे लिए काम करता है

+0

यह नहीं है कि ओपी क्या मांग रहा है –

6

यह अपवाद तब होगा जब आपका सर्वर जेडीके 7 पर आधारित है और आपका ग्राहक जेडीके 6 पर है और एसएसएल प्रमाण पत्र का उपयोग कर रहा है। जेडीके 7 एसएसएलवी 2hello संदेश हैंडशेकिंग डिफ़ॉल्ट रूप से अक्षम है जबकि जेडीके 6 एसएसएलवी 2hello संदेश हैंडशेकिंग सक्षम है। इस कारण से जब आपका क्लाइंट सर्वर से कनेक्ट करने का प्रयास कर रहा है तो एक sslv2hello संदेश सर्वर की ओर भेजा जाएगा और sslv2hello संदेश अक्षम होने के कारण आपको यह अपवाद मिलेगा। इसे हल करने के लिए आपको अपने क्लाइंट को जेडीके 7 पर ले जाना होगा या आपको जेडीके के 6u91 संस्करण का उपयोग करना होगा। लेकिन जेडीके के इस संस्करण को पाने के लिए आपको एमओएस (माई ओरैकल सपोर्ट) एंटरप्राइज़ सपोर्ट प्राप्त करना होगा। यह पैच सार्वजनिक नहीं है।

0

मेरे मामले में मैं एक जेडीके 8 क्लाइंट का उपयोग कर रहा था और सर्वर असुरक्षित पुराने सिफर का उपयोग कर रहा था। वर्तमान में सुरक्षित

SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:!MEDIUM:!LOW:!SSLv2:!EXPORT 

आप इस प्रकार का उपकरण का उपयोग करना चाहिए से मेल नहीं खाता विन्यास को सत्यापित करने के लिए किया गया है:: https://www.ssllabs.com/ssltest/analyze.html

2

आप अगर ग्राहक निर्दिष्ट इस प्राप्त कर सकते हैं सर्वर अपाचे और मैं अपाचे config करने के लिए इस लाइन जोड़ा "https" लेकिन सर्वर केवल "http" चल रहा है। तो, सर्वर एक सुरक्षित कनेक्शन बनाने की उम्मीद नहीं कर रहा है।

संबंधित मुद्दे