2013-06-18 13 views
12

Próbuję wstawić rekord do MySQL, publikując dane na serwerze PHP z aplikacji na Androida. Dodałem uprawnienie INTERNET do AndroidManifest.xmljavax.net.ssl.sslpeerunverifiedexception bez certyfikatu równorzędnego

uzyskać javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

kod Android

private void senddata(ArrayList<NameValuePair> data) 
{ 
    try 
    { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("https://10.0.2.2/insert222.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(data)); 
     HttpResponse response = httpclient.execute(httppost); 

    } 
    catch (Exception e) { 
     // TODO: handle exception 
     Log.e("log_tag", "Error: "+e.toString()); 
    } 
} 

może ktoś pomóc?

+0

Czy rozwiązałeś problem, czy nadal jest on w toku? – Dev

Odpowiedz

8

Warning: Nie zaimplementować to w kodzie produkcyjnym jesteś kiedykolwiek zamiar używać w sieci, nie możesz całkowicie zaufać. Zwłaszcza wszystko, co przechodzi przez publiczny internet. This link podaje bardziej poprawną odpowiedź. Here to implementacja wykorzystująca protokół SSL.

Twój problem polega na użyciu DefaultHttpClient dla https (bezpieczny adres URL).
utworzyć niestandardową DefaultHttpClient

public static HttpClient createHttpClient() 
{ 
    HttpParams params = new BasicHttpParams(); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
    HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET); 
    HttpProtocolParams.setUseExpectContinue(params, true); 

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

    return new DefaultHttpClient(conMgr, params); 
} 

niż zmiany kodu następująco:

 HttpClient httpclient = createHttpClient(); 
     HttpPost httppost = new HttpPost("https://10.0.2.2/insert222.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(data)); 
     HttpResponse response = httpclient.execute(httppost); 

Wystarczy popatrzeć na here jeśli masz problemy
powinno działać.

+11

Nie należy doradzać ludziom, aby "ufali wszystkim certyfikatom", nie informując ich również o naruszeniu bezpieczeństwa, które jest w to zaangażowane. – EJP

+0

@EJP masz rację! Link, którym go kieruję, ma OSTRZEŻENIE! Może to nie wystarczy. –

+1

Ostrzeżenie powinno być tutaj. – EJP

2

Miałem ten problem z serwerem IIS 8. W powiązaniu https musiałem usunąć zaznaczenie pola wyboru "Wymagaj wskazania nazwy serwera". Gdy odznaczę to, przestaję otrzymywać błąd.

+0

@skrrgwasme podczas przeglądania tych, należy przeczytać całe zdanie. Chociaż zaczyna się brzmiąc, jakby to było pytanie lub komentarz "Mam ten problem też", to nie jest. – AdamMc331

+0

@ McAdam331 Masz absolutną rację. Dziękuję za wskazanie.Próbuję przeczytać cały post, ale oczywiście popełniłem błąd w tej sprawie. – skrrgwasme

+0

@skrrgwasme dzieje się z najlepszymi z nas, po prostu chciałem się upewnić, że wiesz. – AdamMc331

0

Muszę powiedzieć, że wszystkie zaufane certyfikaty (zaufane przez autoryzowane centra, takie jak COMODO, Symantec, itp.) Muszą być w każdym przypadku. Jeśli Twoja aplikacja otrzyma taki javax.net.ssl.SSLPeerUnverifiedException: Brak certyfikatu równorzędnego za pomocą kupionego certyfikatu, podasz coś złego po stronie serwera. Aby przetestować, użyj polecenia openssl s_client -connect example.com:443, aby uzyskać wewnętrzne informacje na temat certyfikatu, który otrzymuje twoja aplikacja. W niektórych przypadkach mój serwer nginx wysłał błędny certyfikat.

Powiązane problemy