Ошибка залпа Android: "якорь доверия для пути сертификации не найден", только в реальном устройстве, а не эмуляторе
у меня проблема в моем приложении для Android, в одном из моих фрагментов я использую volley для выполнения сетевого запроса:
JsonObjectRequest request = new JsonObjectRequest(
Request.Method.POST,
CustomNetworkManager.getInstance(this.getActivity().getApplicationContext()).getRequestUrl(url),
requestData,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// process response
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("FeedFragment", "Volley error: " + error.toString());
}
});
на реальном устройстве я получаю следующую ошибку (работает API23):
D/FeedFragment: Volley error: com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
в AVD, работающем с той же версией API, он работает нормально. Я проверил другие подобные темы, но не смог найти ответа.
Спасибо за вашу помощь.
edit: если кто-то сталкивается с той же ошибкой, убедитесь, что у вас нет проблем с вашим сертификаты (http://developer.android.com/intl/pt-br/training/articles/security-ssl.html#CommonProblems)
3 ответов
попробуйте добавить эту функцию в свое приложение:
/**
* Enables https connections
*/
@SuppressLint("TrulyRandom")
public static void handleSSLHandshake() {
try {
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
} catch (Exception ignored) {
}
}
а затем вызовите его в своем приложении onCreate.
обновление:
этот код не имеет значения и не должен использоваться! это запрещено Гуглить. для получения дополнительной информации смотрите здесь.
Это решило мою проблему, пытаясь запустить приложение Android volley на arc welder только нужно запустить один раз..при начальной активности всплеска
на всякий случай один все еще использует Volley...
следуйте инструкциям здесь:
https://developer.android.com/training/articles/security-ssl#java
Скачать файл сертификата (.crt), поместите его в каталог активов (рядом с каталогами java и res), затем измените следующий код:
InputStream caInput = new BufferedInputStream(new FileInputStream("load-der.crt"));
чтобы использовать файл из assets:
InputStream caInput = new BufferedInputStream(getAssets().open("load-der.crt"));
забудьте после
// Tell the URLConnection to use a SocketFactory from our SSLContext
и добавить вместо этого одна строка:
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
запустите этот код перед любыми подключениями.
вот и все.