Ci sono dozzine di post su questo problema (javax.net.ssl.SSLPeerUnverifiedException: Nessun certificato peer) ma non ho trovato nulla che funzioni per me.Fissaggio sicuro: javax.net.ssl.SSLPeerUnverifiedException: Nessun certificato peer
Molti post (come this e this) "risolvono" questo consentendo l'accettazione di tutti i certificati, ma, naturalmente, questa non è una buona soluzione per qualcosa di diverso dal test.
Altri sembrano abbastanza localizzati e non funzionano per me. Spero davvero che qualcuno abbia qualche intuizione che mi manca.
Quindi, il mio problema: sto testando su un server accessibile solo attraverso la rete locale, collegandolo tramite HTTPS. Effettuare la chiamata di cui ho bisogno tramite il browser funziona correttamente. Non mi lamento dei certificati e se controlli i certificati, tutto sembra a posto.
Quando provo sul mio dispositivo Android, ho javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
Ecco il codice che lo chiama:
StringBuilder builder = new StringBuilder();
builder.append(/* stuff goes here*/);
httpGet.setEntity(new UrlEncodedFormEntity(nameValuePairs));
ResponseHandler<String> responseHandler = new BasicResponseHandler();
// Execute HTTP Post Request. Response body returned as a string
HttpClient httpClient = MyActivity.getHttpClient();
HttpGet httpGet = new HttpGet(builder.toString());
String jsonResponse = httpClient.execute(httpGet, responseHandler); //Line causing the Exception
Il mio codice per MyActivity.getHttpClient()
:
protected synchronized static HttpClient getHttpClient(){
if (httpClient != null)
return httpClient;
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, TIMEOUT_CONNECTION);
HttpConnectionParams.setSoTimeout(httpParameters, TIMEOUT_SOCKET);
HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1);
//Thread safe in case various AsyncTasks try to access it concurrently
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager cm = new ThreadSafeClientConnManager(httpParameters, schemeRegistry);
httpClient = new DefaultHttpClient(cm, httpParameters);
CookieStore cookieStore = httpClient.getCookieStore();
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
return httpClient;
}
Qualsiasi aiuto sarebbe molto apprezzato.
Modifica
anche solo per citare ho avuto altri problemi SSL con un'altra applicazione, ma aggiungendo la parte SchemeRegistry
riparato per me prima.
Edit 2
Finora ho testato solo su Android 3.1, ma ho bisogno di questo per lavorare su Android 2.2+ prescindere. Ho appena provato il browser sulla mia scheda Android (Android 3.1) e si lamenta del certificato. Va bene sul mio browser pc, ma non sul browser Android o nella mia app.
Edit 3
'venuto fuori il browser iOS lamenta anche su di esso. Sto iniziando a pensare che sia un problema di catena di certificati qui descritto (SSL certificate is not trusted - on mobile only)
questo problema a causa di https m ho ragione ?? –
Sì, mi sto connettendo tramite https. Aggiornerò la domanda –
Prova questo: https://stackoverflow.com/a/38598593/2301721 – ashishdhiman2007