Есть несколько сообщений об этой проблеме (javax.net.ssl.SSLPeerUnverifiedException: no peer certificate), но я не нашел ничего, что сработало бы для меня.
Многие сообщения (например this и this) "разрешают" это, разрешая всем сертификатам но, конечно, это нехорошее решение для чего угодно, кроме тестирования.
Другие кажутся довольно локализованными и не работают для меня. Я действительно надеюсь, что у кого-то есть понимание, которое мне не хватает.
Итак, моя проблема: я тестирую на сервере, доступном только через локальную сеть, подключаясь через HTTPS. Выполнение вызова, которое мне нужно через браузер, отлично работает. Не жалуйтесь на сертификаты, и если вы проверяете сертификаты, все выглядит хорошо.
Когда я пытаюсь использовать Android-устройство, я получаю javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
Здесь код, который его вызывает:
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
Мой код для 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;
}
Любая помощь будет высоко оценена.
Edit
Также просто упомянуть, что у меня были другие проблемы с SSL с другим приложением, но добавление части SchemeRegistry
исправлено для меня раньше.
Изменить 2
До сих пор я тестировал только на Android 3.1, но мне нужно, чтобы он работал на Android 2.2+ независимо. Я только что протестировал в браузере на вкладке Android (Android 3.1), и он жалуется на сертификат. Это нормально в моем браузере ПК, но не в браузере Android или в моем приложении.
Изменить 3
Оказывается, браузер iOS также жалуется на это. Я начинаю думать, что проблема с цепочкой сертификатов, описанная здесь (SSL-сертификат не доверяет - только на мобильных устройствах)