[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.
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
Powinieneś odpowiedzieć na swoje pytanie i oznaczyć je jako odpowiedź – alkis