2011-09-28 6 views
5

मैं एक एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं जिसे एक एचटीपी-क्लाइंट के माध्यम से क्विकपे की सेवा ("https://secure.quickpay.dk/form") तक पहुंचने की आवश्यकता है। लेकिन पेज तक पहुंचने पर मुझे त्रुटियां मिल रही हैं। अधिक विशेष रूप से मुझे "नो पीयर सर्टिफिकेट" त्रुटि संदेश मिलता है। मैंने पहले से ही कई अलग-अलग चीजों की कोशिश की: मैंने अपने कीस्टोर में रूट प्रमाणपत्र जोड़ने का प्रयास किया, और इस प्रक्रिया के बाद कनेक्ट होने पर इस कीस्टोर का उपयोग करने के लिए: adding certificate to keystore। मैंने यहां से प्रस्तावित विधि के बाद सभी प्रमाणपत्रों को स्वीकार करने का भी प्रयास किया: accepting certificate for android। मैंने अन्य https साइटों से सफलतापूर्वक कनेक्ट किया है, लेकिन इस से कनेक्ट नहीं हो सकता है। मैंने विभिन्न एंड्रॉइड डिवाइस (1.6, 2.2, और 2.3.3) पर कोशिश की है। क्या कोई भी Quickpay की साइट से कनेक्ट करने में सफल हो सकता है, या कोई भी संभावित समाधान/फिक्स के साथ आ सकता है?एंड्रॉइड पर इस HTTPS साइट से कनेक्ट करते समय मैं "नो पीयर सर्टिफिकेट" त्रुटि प्राप्त करने से कैसे बचूं?

// अद्यतन: यदि मैं इस साइट को अपने वेब व्यू के साथ एक्सेस करता हूं: payment window examples, और बटनों में से एक दबाएं (जो मूल रूप से बस कुछ पूर्व परिभाषित चर के साथ एक http पोस्ट लॉन्च करता है) मैं साइट से कनेक्ट करने में सक्षम हूं एंड्रॉइड 2.3.3 पर वेबव्यू। इसके अलावा, मुझे पता चला कि अगर मैं एंड्रॉइड 3.1 पर उपरोक्त एप्लिकेशन लॉन्च करने का प्रयास करता हूं तो मुझे साइट से एक जवाब मिलता है! कोई सुझाव?

public class MyHttpClient extends DefaultHttpClient { 

final Context context; 

public MyHttpClient(Context context) { 
    this.context = context; 
    loadHttps(); 
} 

private void loadHttps() { 
    String url = "https://secure.quickpay.dk/form"; 
    HttpPost httpPost = new HttpPost(url); 
    try { 
     System.out.println("Executing"); 
     this.execute(httpPost); 
    } catch (UnsupportedEncodingException e) { 
     System.out.println(e.getMessage()); 
    } catch (ClientProtocolException e) { 
     System.out.println(e.getMessage()); 
    } catch (IOException e) { 
     System.out.println(e); 
    } 
} 

@Override 
protected ClientConnectionManager createClientConnectionManager() { 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    registry.register(new Scheme("https", newSslSocketFactory(), 443)); 
    return new SingleClientConnManager(getParams(), registry); 
} 

private SSLSocketFactory newSslSocketFactory() { 
    try { 
     KeyStore trusted = KeyStore.getInstance("BKS"); 
     InputStream in = context.getResources().openRawResource(R.raw.test); 
     try { 
      trusted.load(in, "mysecret".toCharArray()); 
     } finally { 
      in.close(); 
     } 
     SSLSocketFactory sf = new SSLSocketFactory(trusted); 
     return sf; 
    } catch (Exception e) { 
     throw new AssertionError(e); 
    } 
} 

}


StackTrace:

WARN/System.err(8459)  at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java 258) 
WARN/System.err(8459)  at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java 93) 
WARN/System.err(8459)  at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java 381) 
WARN/System.err(8459)  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java 177) 
WARN/System.err(8459)  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java 164) 
WARN/System.err(8459)  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java 119) 
WARN/System.err(8459)  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java 359) 
WARN/System.err(8459)  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java 555) 
WARN/System.err(8459)  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java 487) 
WARN/System.err(8459)  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java 465) 
WARN/System.err(8459)  at test.https.MyHttpClient.loadHttps(MyHttpClient.java 34) 
WARN/System.err(8459)  at test.https.MyHttpClient.<init>(MyHttpClient.java 26) 
WARN/System.err(8459)  at test.https.HttpsTesterActivity.onCreate(HttpsTesterActivity.java 60) 
WARN/System.err(8459)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java 1047) 
WARN/System.err(8459)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java 1615) 
WARN/System.err(8459)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java 1667) 
WARN/System.err(8459)  at android.app.ActivityThread.access$1500(ActivityThread.java 117) 
WARN/System.err(8459)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java 935) 
WARN/System.err(8459)  at android.os.Handler.dispatchMessage(Handler.java 99) 
WARN/System.err(8459)  at android.os.Looper.loop(Looper.java 123) 
WARN/System.err(8459)  at android.app.ActivityThread.main(ActivityThread.java 3687) 
WARN/System.err(8459)  at java.lang.reflect.Method.invokeNative(Native Method)  
WARN/System.err(8459)  at java.lang.reflect.Method.invoke(Method.java 507) 
WARN/System.err(8459)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java 842) 
WARN/System.err(8459)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java 600) 
+0

क्या प्रमाण पत्र है कि आपको एक सामान्य साइट प्रमाणपत्र मिल रहा है, या यह एक व्यक्तिगत (या कंपनी) प्रमाण पत्र है जिसे आपने क्विकपे से प्राप्त किया है? यह क्या प्रारूप है? pkx? p12? –

+1

कृपया पूरा संदेश पोस्ट करें और ट्रेस स्टैक करें। – EJP

+0

@ पीटरकेनेगो, मैंने अपने ब्राउज़र के माध्यम से क्विकपे की साइट से रूट प्रमाण पत्र डाउनलोड किया। प्रमाणपत्र इक्विफैक्स द्वारा दिया गया है। इसके बाद मैंने एंड्रॉइड में लोड करने के लिए प्रमाण पत्र को पी 12 प्रमाणपत्र में परिवर्तित कर दिया। –

उत्तर

1

बस संक्षेप में, मैंने वेबव्यू दृष्टिकोण पर चिपके हुए इस मुद्दे को ठीक किया। एपीआई के साथ बातचीत को सर्वर पर ले जाया गया था, जो एक मध्यवर्ती संचार बिंदु बना रहा था जो प्रमाण पत्र के मुद्दों को संभालता है। सबसे सुरुचिपूर्ण समाधान नहीं है लेकिन यह काम करता है :)

0

यह बहुत रहस्यमय है। एक HTTPS/SSL सर्वर प्रमाण पत्र भेजने से बचने का एकमात्र तरीका यह है कि यदि दोनों पक्ष रिवर्स में SSL कनेक्शन संचालित करने के लिए सहमत हैं, जहां सर्वर SSL क्लाइंट है और क्लाइंट SSL सर्वर है, तो प्रमाणपत्र दूसरी दिशा में यात्रा करता है। लेकिन मैं आपके कोड में कुछ भी नहीं देख सकता जो उस मोड को सक्षम करता है, और इसे दूसरे छोर पर भी सक्षम होना होगा। और आपको अपने कीस्टोर से प्रमाणपत्र प्रमाणित करना होगा ... बहुत अजीब।

+0

मैं एक प्रमाणपत्र प्रदान करता हूं, जिसे यहां "परीक्षण" कहा जाता है, जिसे मैं अपने "कच्चे" संसाधनों से लोड करता हूं (ऊपर कोड देखें)। यह मेरे द्वारा प्राप्त ब्राउज़र के साथ प्राप्त और सहेजा गया परिवर्तित रूट प्रमाणपत्र है। –

0

कनेक्शन बनाने के लिए UrlConnection क्लास का उपयोग करने का प्रयास करें, और देखें कि आप इस "कोई सहकर्मी प्रमाणपत्र" त्रुटि से बच सकते हैं या नहीं।

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