Istnieją dziesiątki postów dotyczących tego problemu (javax.net.ssl.SSLPeerUnverifiedException: Brak certyfikatu równorzędnego), ale nie znalazłem niczego, co będzie dla mnie działało.Bezpieczne naprawianie: javax.net.ssl.SSLPeerUnverifiedException: Brak certyfikatu równorzędnego
"Wiele postów (takich jak this i this) rozwiązuje ten problem, umożliwiając akceptację wszystkich certyfikatów, ale oczywiście nie jest to dobre rozwiązanie do innych celów niż testowanie.
Inne wydają się dość zlokalizowane i nie działają dla mnie. Naprawdę mam nadzieję, że ktoś ma wgląd w to, czego mi brakuje.
Mój problem: testuję na serwerze dostępnym tylko przez sieć lokalną, łącząc się przez HTTPS. Wykonanie połączenia, którego potrzebuję za pośrednictwem przeglądarki, działa dobrze. Bez narzekania na certyfikaty i jeśli sprawdzasz certyfikaty, wszystko wygląda dobrze.
Kiedy próbuję na urządzeniu z Androidem, mam javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
Oto kod, który wywołuje go:
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
Mój kod 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;
}
Każda pomoc będzie znacznie docenione.
Edit
Również tylko wspomnieć, miałem inne problemy SSL z innej aplikacji, ale dodając część SchemeRegistry
stałe to dla mnie wcześniej.
Edycja 2
Jak dotąd testowane tylko na Androida 3.1, ale muszę to działa na Androidzie 2.2+ niezależnie. Właśnie testowałem w przeglądarce na mojej karcie Android (Android 3.1) i skarży się na certyfikat. To działa dobrze w mojej przeglądarce, ale nie w przeglądarce Androida ani w mojej aplikacji.
Edycja 3
Okazuje się, że przeglądarka iOS skarży się również na ten temat. Zaczynam myśleć, że jest to kwestia Łańcuch certyfikatów opisane tutaj (SSL certificate is not trusted - on mobile only)
ten problem ze względu na https m i right ?? –
Tak Łączę się przez https. Zaktualizuję pytanie: –
Spróbuj tego: https://stackoverflow.com/a/38598593/2301721 – ashishdhiman2007