2012-11-01 9 views
6

[SOLVED] - patrz poniżejAndroid - Połączenie HTTPS do .NET WCF usługi daje SSLException: „Bez certyfikatu partnerskiego”

byłem coraz wyjątek podczas próby uzyskać niektóre dane JSON z mego odpoczynku włączone WCF Usługa w systemie Android 2.2 przez połączenie HTTPS. Wtedy zauważyłem, że dzieje się coś bardzo dziwnego. Po uruchomieniu aplikacji na moim telefonie działało świetnie i otrzymywałoby piękne dane JSON. Jednak podczas uruchamiania aplikacji na moim emulatorze nastąpiło awarie, gdy tylko wykonano polecenie "httpclient.execute (request)", podając wyjątek SLLException: no peer. Jest to szczególnie dziwne, ponieważ moja usługa WCF miała ważny certyfikat podpisany RapidSSL (CA). Dodatkowo upewniłem się, że certyfikaty klienta nie są potrzebne w moim IIS. (Również ta funkcja nie działa na UIThread !, został uruchomiony w oddzielnym wątku.)

mój kod:

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(); 

Teraz Próbowałem szukając rozwiązania, jednak w zasadzie nie ma rozwiązania dopasowane do tej sytuacji.

[ROZWIĄZANIE]

Moja emulator został uruchomiony przez snapshot odkąd edytować plik hosts, więc nie trzeba ustawić się w moją usługę DNS. Teraz nadchodzi haczyk, ponieważ za każdym razem przebiegłem go przez migawkę. Data została ustawiona na OCT 24 2012 z czasem 18:48 w emulatorze. Wtedy zdałem sobie sprawę, że datę, dla której potwierdziłem certyfikat, była data 27 października 2012 r., Z czasem 14:45. Najwyraźniej opcja "get time from the internet" NIE działa na emulatorze. Sprawiło to, że mój klient httpcl rzucił wyjątek "Brak certyfikatu równorzędnego", ponieważ technicznie nie miał on potwierdzonego certyfikatu w emulatorze. Smutną częścią jest to, że kiedy szukasz rozwiązania tego wyjątku ze słowami kluczowymi takimi jak "android" lub "https android wcf", otrzymujesz wyniki osób z problemami związanymi z samopodpisanymi certyfikatami.

TL; DR: Podobno w przyszłości zatwierdzone certyfikaty nie zostaną zaakceptowane.

+0

Przyjemnie, że mogłem się o tym przekonać. Mam tendencję do odczuwania pewnego zamieszania w twoim "najwyraźniej", ale jest to logiczne: certyfikat jest ważny od X do Y. Jeśli aktualny czas leży poza tym okresem, zgodnie z określoną maszyną, certyfikat jest uznawany za nieważny na tym komputerze. – CodeCaster

+3

Powinieneś odpowiedzieć na swoje pytanie i oznaczyć je jako odpowiedź – alkis

Odpowiedz

0

Zgodnie z informacjami podanymi przez Arcshade.

Mój emulator działał przez migawkę, ponieważ edytowałem plik hosts, więc nie musiałem ustawiać mojej usługi w DNS. Teraz nadchodzi haczyk, ponieważ za każdym razem przebiegłem go przez migawkę. Data została ustawiona na OCT 24 2012 z czasem 18:48 w emulatorze. Wtedy zdałem sobie sprawę, że datę, dla której potwierdziłem certyfikat, była data 27 października 2012 r., Z czasem 14:45. Najwyraźniej opcja "get time from the internet" NIE działa na emulatorze. Sprawiło to, że mój klient httpcl rzucił wyjątek "Brak certyfikatu równorzędnego", ponieważ technicznie nie miał on potwierdzonego certyfikatu w emulatorze. Smutne jest to, że gdy szukasz rozwiązania tego wyjątku ze słowami kluczowymi takimi jak "android" lub "https android wcf", otrzymujesz wyniki tylko osób mających problemy z samopodpisanymi certyfikatami.

Powiązane problemy