it-swarm.dev

javax.net.ssl.sslpeerunverifiedexception no peer certificate

Próbuję wstawić rekord do MySQL, wysyłając dane na serwer PHP z aplikacji na Androida. Dodałem uprawnienie INTERNET do AndroidManifest.xml

Dostaję 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());
    }
}

Czy ktoś może pomóc?

12
Break Hart

Ostrzeżenie : Nie implementuj tego w kodzie produkcyjnym, którego kiedykolwiek użyjesz w sieci, której nie do końca ufasz. Zwłaszcza wszystko, co dzieje się w publicznym Internecie. Ten link daje bardziej poprawną odpowiedź. Tutaj jest implementacją używającą SSL.

Twój problem polega na tym, że używasz DefaultHttpClient na https (bezpieczny adres URL). 
Utwórz niestandardowy klient 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);
}

Następnie zmień kod w następujący sposób:

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

Spójrz na tutaj jeśli masz problemy
Powinno działać.

7
Lazy Ninja

Miałem ten problem z serwerem IIS 8. W powiązaniu https musiałem odznaczyć pole wyboru „Wymagaj wskazania nazwy serwera”. Po usunięciu zaznaczenia go, przestałem otrzymywać błąd.

2
Tim Cooke

Muszę powiedzieć, że wszystkie zaufane certyfikaty (zaufane przez autoryzowane centra, takie jak COMODO, Symantec itp.) Muszą działać w każdym przypadku. Jeśli Twoja aplikacja otrzyma takie javax.net.ssl.SSLPeerUnverifiedException: Brak certyfikatu równorzędnego używając kupionego certyfikatu, podajesz coś złego po stronie serwera. Aby przetestować, użyj polecenia openssl s_client -connect example.com:443, aby uzyskać wewnętrzne informacje o certyfikacie otrzymanym przez aplikację. W niektórych przypadkach mój serwer nginx wysłał nieprawidłowy certyfikat.

0
Vyacheslav