2012-11-01 11 views
6

[हल] - नीचेएंड्रॉयड - Https एक .NET WCF सेवा के लिए कनेक्शन SSLException देता है: "कोई सहकर्मी प्रमाणपत्र"

देखें मैं एक अपवाद जब सक्षम मेरी बाकी हिस्सों से कुछ JSON डेटा WCF प्राप्त करने की कोशिश हो रही किया गया है एचटीटीपीएस कनेक्शन पर एंड्रॉइड 2.2 में सेवा। मैंने तब कुछ अजीब घटना देखी। मेरे फोन पर एप्लिकेशन चलाते समय यह बहुत अच्छा काम करता था और इसे सुंदर JSON डेटा वापस मिल जाएगा। हालांकि, मेरे एमुलेटर पर एप्लिकेशन चलाते समय, जैसे ही "httpclient.execute (अनुरोध)" निष्पादित किया गया था, यह एक एसएलईएक्सएक्सप्शन दे रहा था: कोई सहकर्मी प्रमाणपत्र नहीं। यह विशेष रूप से अजीब है क्योंकि मेरी डब्ल्यूसीएफ सेवा के पास वैध रैपिडएसएसएल हस्ताक्षरित प्रमाणपत्र (सीए) था। इसके अलावा मैंने सुनिश्चित किया कि मेरे आईआईएस के अंदर ग्राहक प्रमाणपत्र की आवश्यकता नहीं है।

public Object getJSON(String URL, HashMap<String, String> parameters, String METHOD, String TAG) { 
    try { 
     this.TAG = TAG; 
     // Send GET request to <service>/METHOD?params 
     //Target API(8) for AndroidHttpClient and Target API(5) for DefaultHttpClient 
     AndroidHttpClient client = AndroidHttpClient.newInstance("Android"); 
     String params = "?"; 
     if(parameters != null){ 
      for (Entry<String, String> para : parameters.entrySet()) { 
       params = params + (String)para.getKey() + "=" + (String)para.getValue() + "&"; 
      } 
      params = params.substring(0, params.length() - 1); 
      Log.i("U's n P's", params);//Username and password check 
     } 

     HttpGet request = new HttpGet(URL + METHOD + params); 
     Log.i(TAG, request.getRequestLine().toString()); 
     request.setHeader("Accept", "application/json"); 
     request.setHeader("Content-type", "application/json"); 
     HttpResponse response = client.execute(request);//Crashes here 
     HttpEntity responseEntity = response.getEntity(); 

     // Read response data into buffer 
     char[] buffer = new char[(int)responseEntity.getContentLength()]; 
     InputStream stream = responseEntity.getContent(); 
     InputStreamReader reader = new InputStreamReader(stream); 
     reader.read(buffer); 
     stream.close(); 

अब मैं एक समाधान के लिए खोज की कोशिश की है, हालांकि मूल रूप से कोई समाधान नहीं:

मेरे कोड (इसके अलावा इस समारोह UIThread पर नहीं चल रहा था !, यह एक अलग थ्रेड पर चल रहा था।) इस स्थिति को फिट किया।

[समाधान]

मेरे एमुलेटर एक स्नैपशॉट के माध्यम से चल रहा था के बाद से मैं मेजबान फ़ाइल तो मैं एक DNS में मेरी सेवा सेट अप करने की ज़रूरत नहीं थी संपादित। अब कैच आता है, क्योंकि मैंने इसे हर बार स्नैपशॉट के माध्यम से चलाया था। यह तारीख ओसीटी 24 2012 को एम्यूलेटर में समय 18:48 के साथ सेट की गई थी। तब मुझे एहसास हुआ कि मैंने प्रमाण पत्र सत्यापित किया था ओसीटी 27 2012 समय 14:45 के साथ। स्पष्ट रूप से "इंटरनेट से समय प्राप्त करें" विकल्प एम्यूलेटर पर काम नहीं करता है। इसने मेरे httpclient को "नो पीयर सर्टिफिकेट" अपवाद फेंक दिया क्योंकि तकनीकी रूप से एम्यूलेटर में मान्य प्रमाण पत्र नहीं था। दुखद बात यह है कि जब आप "एंड्रॉइड" या "https एंड्रॉइड डब्ल्यूसीएफ" के रूप में कीवर्ड के साथ इस अपवाद के समाधान की खोज करते हैं, तो आपको केवल स्वयं हस्ताक्षरित प्रमाणपत्र से संबंधित समस्याओं वाले लोगों के परिणाम मिलते हैं।

टीएल; डीआर: जाहिर है भविष्य में मान्य प्रमाण पत्र स्वीकार नहीं किए जाते हैं।

+0

इसे स्वयं ढूंढने के लिए अच्छा लगा। मैं आपके _ "जाहिर तौर पर" _ में कुछ भ्रम पढ़ता हूं, लेकिन यह तार्किक है: प्रमाण पत्र एक्स से वाई तक मान्य है। यदि वर्तमान समय उस अवधि के बाहर एक निश्चित मशीन के अनुसार है, तो प्रमाण पत्र उस मशीन पर अमान्य माना जाता है। – CodeCaster

+3

आपको अपने प्रश्न का उत्तर देना चाहिए और इसे उत्तर के रूप में चिह्नित करना चाहिए – alkis

उत्तर

0

आर्कशेड द्वारा बताए अनुसार।

मेरा एमुलेटर स्नैपशॉट के माध्यम से चल रहा था क्योंकि मैंने मेजबान फ़ाइल संपादित की थी इसलिए मुझे अपनी सेवा को DNS में सेट करने की आवश्यकता नहीं थी। अब कैच आता है, क्योंकि मैंने इसे हर बार स्नैपशॉट के माध्यम से चलाया था। यह तारीख ओसीटी 24 2012 को एम्यूलेटर में समय 18:48 के साथ सेट की गई थी। तब मुझे एहसास हुआ कि मैंने प्रमाण पत्र सत्यापित किया था ओसीटी 27 2012 समय 14:45 के साथ। स्पष्ट रूप से "इंटरनेट से समय प्राप्त करें" विकल्प एम्यूलेटर पर काम नहीं करता है। इसने मेरे httpclient को "नो पीयर सर्टिफिकेट" अपवाद फेंक दिया क्योंकि तकनीकी रूप से एम्यूलेटर में मान्य प्रमाण पत्र नहीं था। दुखद बात यह है कि जब आप इस अपवाद के समाधान को "एंड्रॉइड" या "https एंड्रॉइड डब्ल्यूसीएफ" के रूप में खोजते हैं, तो आपको केवल स्वयं हस्ताक्षरित प्रमाणपत्रों से संबंधित समस्याओं वाले लोगों के परिणाम मिलते हैं।