2012-01-10 23 views
12

जब भी यह कोड चलता है, तो मुझे 'नो पीयर सर्टिफिकेट' त्रुटि मिलती है।एंड्रॉइड एसएसएल - कोई पीयर सर्टिफिकेट

एसएसएल प्रमाणपत्र वैध है, नामचेप (PositiveSSL) से खरीदा गया है। इसके सामने सीए क्रेट है, और एंड्रॉइड ब्राउज़र में ठीक खुलता है।

HTTP सर्वर: nginx

कोड:

public void postData() { 

// Add your data 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 

nameValuePairs.add(new BasicNameValuePair("string", "myfirststring")); 

try { 

    HttpPost post = new HttpPost(new URI("https://example.com/submit")); 
    post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

    KeyStore trusted = KeyStore.getInstance("BKS"); 
    trusted.load(null, "".toCharArray()); 
    SSLSocketFactory sslf = new SSLSocketFactory(trusted); 
    sslf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

    SchemeRegistry schemeRegistry = new SchemeRegistry(); 
    schemeRegistry.register(new Scheme ("https", sslf, 443)); 
    SingleClientConnManager cm = new SingleClientConnManager(post.getParams(), 
      schemeRegistry); 

    HttpClient client = new DefaultHttpClient(cm, post.getParams()); 

    // Execute HTTP Post Request 
    @SuppressWarnings("unused") 
    HttpResponse result = client.execute(post); 

} catch (ClientProtocolException e) { 
    // TODO Auto-generated catch block 
    Log.e(TAG,e.getMessage()); 
    Log.e(TAG,e.toString()); 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    Log.e(TAG,e.getMessage()); 
    Log.e(TAG,e.toString()); 
    e.printStackTrace(); 
} catch (URISyntaxException e) { 
     // TODO Auto-generated catch block 
    Log.e(TAG,e.getMessage()); 
    Log.e(TAG,e.toString()); 
    e.printStackTrace(); 
    } catch (KeyStoreException e) { 
     // TODO Auto-generated catch block 
     Log.e(TAG,e.getMessage()); 
     Log.e(TAG,e.toString()); 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     Log.e(TAG,e.getMessage()); 
     Log.e(TAG,e.toString()); 
     e.printStackTrace(); 
    } catch (CertificateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     Log.e(TAG,e.toString()); 
     Log.e(TAG,e.getMessage()); 
    } catch (KeyManagementException e) { 
     // TODO Auto-generated catch block 
     Log.e(TAG,e.getMessage()); 
     Log.e(TAG,e.toString()); 
     e.printStackTrace(); 
    } catch (UnrecoverableKeyException e) { 
     // TODO Auto-generated catch block 
     Log.e(TAG,e.getMessage()); 
     Log.e(TAG,e.toString()); 
     e.printStackTrace(); 
    } 
} 

adb logcat:

01-10 15:44:34.872: E/myfirstapp(572): No peer certificate 
01-10 15:44:34.872: E/myfirstapp(572): javax.net.ssl.SSLPeerUnverifiedException: No peer certificate 
01-10 15:44:34.883: W/System.err(572): javax.net.ssl.SSLPeerUnverifiedException: No peer certificate 
01-10 15:44:34.883: W/System.err(572): at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:137) 
01-10 15:44:34.883: W/System.err(572): at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93) 
01-10 15:44:34.908: W/System.err(572): at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381) 
01-10 15:44:34.908: W/System.err(572): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165) 
01-10 15:44:34.908: W/System.err(572): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
01-10 15:44:34.914: W/System.err(572): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
01-10 15:44:34.914: W/System.err(572): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
01-10 15:44:34.914: W/System.err(572): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
01-10 15:44:34.914: W/System.err(572): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
01-10 15:44:34.914: W/System.err(572): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
01-10 15:44:34.933: W/System.err(572): at com.giggsey.myfirstapp.myfirstappIntent.postData(myfirstappIntent.java:126) 
01-10 15:44:34.933: W/System.err(572): at com.giggsey.myfirstapp.myfirstappIntent.onReceive(myfirstappIntent.java:77) 
01-10 15:44:34.933: W/System.err(572): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2118) 
01-10 15:44:34.945: W/System.err(572): at android.app.ActivityThread.access$1500(ActivityThread.java:122) 
01-10 15:44:34.945: W/System.err(572): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
01-10 15:44:34.952: W/System.err(572): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-10 15:44:34.952: W/System.err(572): at android.os.Looper.loop(Looper.java:137) 
01-10 15:44:34.962: W/System.err(572): at android.app.ActivityThread.main(ActivityThread.java:4340) 
01-10 15:44:34.962: W/System.err(572): at java.lang.reflect.Method.invokeNative(Native Method) 
01-10 15:44:34.962: W/System.err(572): at java.lang.reflect.Method.invoke(Method.java:511) 
01-10 15:44:34.972: W/System.err(572): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
01-10 15:44:34.972: W/System.err(572): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
01-10 15:44:34.981: W/System.err(572): at dalvik.system.NativeStart.main(Native Method) 
+1

चूंकि प्रमाण पत्र मान्य है, क्या आप अपनी योजना के बिना कोशिश कर सकते हैं रजिस्ट्री, बस डिफ़ॉल्ट एंड्रॉइड पर भरोसा करते हैं? – kenota

+2

प्रमाण पत्र का परीक्षण करने के लिए इस पृष्ठ का उपयोग करें। मुझे पूरा यकीन है कि आप कुछ मध्यवर्ती प्रमाण पत्र खो रहे हैं। https://www.digicert.com/help/index.htm आपको यह बताना चाहिए कि यह एक सर्वर से संबंधित समस्या है या नहीं। जो मुझे लगता है कि यह है। – blindstuff

+0

@blindstuff उस पृष्ठ से सभी ticks। – giggsey

उत्तर

20

हालांकि इस सवाल का एक स्वीकृत जवाब मैं इसे सार्थक जवाब देने के लिए के बाद से मैं चल किसी पुराने Android उपकरण 2.3.3 पर एक ही त्रुटि मिली सोचा है निष्कर्ष पर पहुंचे कि इस दो (शायद अधिक?) कारणों से हो सकता:

  • मध्यवर्ती प्रमाणपत्र का अनुचित स्थापना
  • प्रमाणपत्र श्रृंखला की
  • गलत आदेश

मेरे मामले में यह प्रमाणपत्रों का गलत आदेश था। उदाहरण के तौर पर मैं this question से उपयोगकर्ता bdc के अंतर्दृष्टिपूर्ण उत्तर के साथ प्रमाण आदेश पोस्ट कर रहा हूं। आप एक टर्मिनल से निम्नलिखित कार्य करके प्रमाणपत्र आदेश प्राप्त कर सकते हैं:

openssl s_client -connect eu.battle.net:443 

(अपने खुद के सर्वर के साथ स्पष्ट रूप से जगह eu.battle.net)। उस समय eu.battle.net के मामले में आदेश था:

Certificate chain 
0 s:/C=US/ST=California/L=Irvine/O=Blizzard Entertainment, Inc./CN=*.battle.net 
    i:/C=US/O=Thawte, Inc./CN=Thawte SSL CA 
1 s:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA 
    i:/C=ZA/ST=Western Cape/L=Cape Town/O=Thawte Consulting cc/OU=Certification Services Division/CN=Thawte Premium Server CA/[email protected] 
2 s:/C=US/O=Thawte, Inc./CN=Thawte SSL CA 
    i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA 

हालांकि यह किया जाना चाहिए था:

Certificate chain 
0 s:/C=US/ST=California/L=Irvine/O=Blizzard Entertainment, Inc./CN=*.battle.net 
    i:/C=US/O=Thawte, Inc./CN=Thawte SSL CA 
1 s:/C=US/O=Thawte, Inc./CN=Thawte SSL CA 
    i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA 
2 s:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA 
    i:/C=ZA/ST=Western Cape/L=Cape Town/O=Thawte Consulting cc/OU=Certification Services Division/CN=Thawte Premium Server CA/[email protected] 

नियम यह है कि "n" श्रृंखला में प्रमाणपत्र के जारीकर्ता प्रमाण पत्र "एन + 1" से मेल खाना चाहिए।

एक बार मुझे समस्या मिली तो सर्वर पर प्रमाण आदेश बदलने के लिए यह मामूली था और चीजें तुरंत एंड्रॉइड 2.3.3 डिवाइस पर काम करना शुरू कर दीं। मुझे लगता है कि यह अच्छा है कि पुराने एंड्रॉइड संस्करण प्रमाण पत्र के बारे में थोड़ी परेशान हैं, लेकिन यह भी एक दुःस्वप्न था क्योंकि नए एंड्रॉइड संस्करण स्वचालित रूप से कर्टों को फिर से व्यवस्थित करते हैं। नरक, यहां तक ​​कि एक पुराना आईफोन 3 जीएस भी आदेश से बाहर कर्ट के साथ काम किया।

+0

इस उत्तर के लिए धन्यवाद। मेरे पास प्रमाण पत्र जारी करने का प्रमाण पत्र था और यह मुझे पागल कर रहा था - स्पष्ट रूप से एंड्रॉइड के कुछ संस्करण गलत क्रम में प्रमाण पत्र स्वीकार करते हैं, और कुछ नहीं करते हैं। –

+0

मेरे लिए डिट्टो, रैपिड्सस्ल जारी किए गए कर्ट पीछे थे, सभी ब्राउज़रों ने काम किया लेकिन मेरा ऐप असफल रहा। जब मैंने सभी कामों को फिर से व्यवस्थित किया। बहुत बहुत धन्यवाद! – mvsjes2

+0

उपरोक्त। मैंने कीटोल और बाउंसीकैसल विश्वसनीय कुंजीस्टोर के कई अलग-अलग तरीकों की कोशिश की लेकिन अंत में, एंड्रॉइड 2.3 को बस मेरे सर्वर की एसएसएल श्रृंखला में इंटरमीडिएट प्रमाणपत्र नहीं मिला। न तो एंड्रॉइड जेलीबीन, फ़ायरफ़ॉक्स, आईई या क्रोम ने शिकायत की - केवल एंड्रॉइड 2.3 डिफ़ॉल्ट एचटीटीपी क्लाइंट। Gd_intermediate.crt जोड़ने के बाद, मेरा जीबी ऐप एसएसएल पर काम करता है। विवरण के लिए यहां देखें: http: //informationideas.com/news/2011/11/29/android-making-https-requests-with-ssl-from-godaddy-no-peer-certificate-error/ – wufoo

2

यदि यह एक सर्वर मुद्दा है, मेरे पास है जो ज्यादातर मामलों में है कि नहीं है इस मुद्दे को देखा गया है यह या तो गायब मध्यवर्ती चेतावनी से संबंधित है या कर्टों का एक बुरा स्थापित है।

इस तरह योजना रजिस्ट्री उपयोग करके देखें:

SchemeRegistry schReg = new SchemeRegistry(); 
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
schReg.register(new Scheme("https",SSLSocketFactory.getSocketFactory(), 443)); 
SingleClientConnManager conMgr = new SingleClientConnManager(params,post.getParams()); 
+3

मैंने 'mClient = new DefaultHttpClient() का उपयोग किया; mClient.getConnectionManager()। getSchemeRegistry()। रजिस्टर (नई योजना ("SSLSocketFactory", SSLSocketFactory.getSocketFactory(), 443)); और यह काम किया। धन्यवाद! – shkschneider

+0

@shkschneider, तुम मेरे नायक हो! – sha256

+2

@shkschneider ... मैंने अपने एचटीपी क्लाइंट के साथ इस लाइन को भी आजमाया लेकिन यह मुझे एक ही त्रुटि "नो पीयर सर्टिफिकेट" दे रहा है ... मैं https अनुरोध के साथ JSON पैरा भेज रहा हूं ... कृपया मेरी मदद करें – Noman

-1

क्योंकि प्रमाणपत्र मान्य है आप कस्टम SchemeRegistry उपयोग नहीं करना चाहिए, आप डिफ़ॉल्ट एंड्रॉयड प्रमाण पत्र सत्यापन तंत्र पर अभी भरोसा करना चाहिए।

+2

क्या आप कृपया विस्तारित कर सकते हैं इस? मुझे यह पता लगाना प्रतीत नहीं होता कि इस डिफ़ॉल्ट तंत्र का उपयोग कैसे करें। –

+3

क्या आप इस बारे में अधिक जानकारी दे सकते हैं जो इस डिफ़ॉल्ट तंत्र के लिए कोड कैसे जानते हैं? – JPM

+0

बिल्कुल सही। धन्यवाद। उत्तर के लिए एसओ की एक सीमा सीमा पूरी तरह स्वीकार्य नहीं है। #sad –

3

यह white paper आपके एसएसएल को एंड्रॉइड पर काम करने के लिए जानने के लिए आवश्यक सब कुछ सारांशित कर सकता है। मेरे हाल के अनुभव के आधार पर, एंड्रॉइड पसंद करते हुए एसएसएल प्रमाणपत्र प्राप्त करने का सबसे अच्छा तरीका है।

+1

"सबसे अच्छा तरीका एसएसएल प्रमाण पत्र प्राप्त करना है जो एंड्रॉइड पसंद करता है।" दुर्भाग्यवश, उपयोगी समय केवल तब होता है जब आपके पास सर्वर की ओर नियंत्रण करने की लक्जरी होती है। यह दुर्लभ है।वह श्वेत पत्र निश्चित रूप से उपयोगी है हालांकि। –

0

मैं वास्तव में अभी इसे स्वयं निदान करने की कोशिश कर रहा हूं, और ऐसा लगता है कि यह समस्या यह है कि सर्वर डाउन है या कनेक्शन का समय समाप्त हो गया है।

javax.net.ssl.SSLPeerUnverifiedException: No peer certificate 

अतः मैं पर कई अलग अलग संबंधित प्रश्नों को पढ़ने के बाद:

0

मैं सभी योजना रजिस्ट्री कर्मचारियों को हटा देता हूं और "कोई सहकर्मी प्रमाणन त्रुटि" हल नहीं होती है।

यानी।

मैं इस कोड को निकालने मेरा

SchemeRegistry schReg = new SchemeRegistry(); 
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
schReg.register(new Scheme("https",SSLSocketFactory.getSocketFactory(), 443)); 
SingleClientConnManager conMgr = new SingleClientConnManager(params,post.getParams()); 

तुम अपने से उन हटाने की कोशिश कर सकते हो सकते हैं।

0

मैंने "सभी प्रमाण पत्र स्वीकार करें" नियम जोड़कर एंड्रॉइड कोड से इसे ठीक करने का प्रयास किया। लेकिन एंड्रॉइड पक्ष से सभी प्रयास बेकार था। अंततः रजिस्ट्रार एंट्री में एक सीएनएन बनाकर यह सुनिश्चित किया गया कि सभी अनुरोध एक ही आईपी पते पर जाएं

1

अपने सिस्टम का समय जांचें। अगर समय वर्तमान समय नहीं है तो यह त्रुटि हो सकती है।

+1

यह एक हो सकता है टिप्पणी। –

0

सुनिश्चित करें कि आप HttpURLConnection के बजाय HttpsURLConnection का उपयोग कर रहे हैं।

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