2013-06-18 16 views
12

Sto cercando di inserire un record in MySQL con la pubblicazione di dati a un server PHP da un app Android. Ho aggiunto il permesso Internet per AndroidManifest.xmljavax.net.ssl.sslpeerunverifiedexception nessun certificato pari

ottengo javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

codice di 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()); 
    } 
} 

Qualcuno può aiutarmi?

+0

hai risolto il problema o sei ancora in sospeso? – Dev

risposta

8

Attenzione: Non implementare questo nel codice di produzione si è mai intenzione di utilizzare su una rete non lo fai del tutto la fiducia. Soprattutto tutto ciò che riguarda la rete pubblica. This link fornisce una risposta più corretta. Here è un'implementazione che utilizza SSL.

Il problema è che si sta utilizzando DefaultHttpClient per https (URL sicuro).
Creare un DefaultHttpClient personalizzato

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

che cambiare il codice come segue:

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

Dai un'occhiata alla here se avete problemi
dovrebbe funzionare.

+11

Non si consiglia alle persone di 'fidarsi di tutti i certificati' senza avvisare anche loro della violazione della sicurezza che è implicata. – EJP

+0

@EJP hai ragione! Il link che ho diretto a lui ha l'AVVISO! Forse non è abbastanza. –

+1

L'avviso dovrebbe essere qui. – EJP

2

Ho riscontrato questo problema con un server IIS 8. Nel binding https, ho dovuto deselezionare la casella di controllo "Richiedi indicazione nome server". Una volta deselezionata, ho smesso di ricevere l'errore.

+0

@skrrgwasme durante la revisione di questi, assicurarsi di leggere l'intera frase. Mentre inizia a suonare come se fosse una domanda o un commento 'Ho anche questo problema', non lo è. – AdamMc331

+0

@ McAdam331 Hai assolutamente ragione. Grazie per segnalarlo.Cerco di leggere l'intero post, ma ovviamente ho fatto un errore su questo. – skrrgwasme

+0

@skrrgwasme capita al meglio di noi, volevo solo essere sicuro di sapere. – AdamMc331

0

devo dire che tutti i certificati attendibili (fiducia da parte dei centri autorizzati, come COMODO, Symantec, ecc) devono essere il lavoro in ogni caso. Se la tua app riceve tale javax.net.ssl.SSLPeerUnverifiedException: Nessun certificato peer utilizzando il certificato acquistato, dai qualcosa di sbagliato sul lato server. Per testare utilizzare il comando openssl s_client -connect example.com:443 per ottenere informazioni interne sul certificato ricevuto dall'app. In alcuni casi il mio server nginx ha inviato certificati errati in alcuni casi.

Problemi correlati