Поддержка HTTPS для сетевой библиотеки Volley Android
У меня есть проект, выполняющий вызовы REST для бэкэнда HTTPS. Он отлично работает на некоторых устройствах и ломается на других.
Это ошибка, которую я получаю:
com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: рукопожатие SSL прервано: ssl=0x78004ee8: сбой в библиотеке SSL, обычно ошибка протокола:140770FCSL routinesSLER_STER_SLE_RG /openssl/ssl/s23_clnt.c:766 0x731f5d5c:0x00000000)
Глядя на документацию Volley, они упоминают
"Вы можете включить свой собственный HTTPStack (для обработки соединений SSL [...])"
Кто-то сделал это для залпа? Если да, можете ли вы поделиться своими изменениями?
Примечания: Сертификат подписан действительным объектом, который уже был в доверенных сертификатах устройств.
1 ответ
Вот мое решение:
В классе Volley
в методе
public static RequestQueue newRequestQueue(Context context, HttpStack stack)
найдите следующий текст:
stack = new HurlStack();
Затем измените эту строку на:
stack = new HurlStack(null, createSslSocketFactory());
где метод createSslSocketFactory()
определяется следующим образом:
private static SSLSocketFactory createSslSocketFactory() {
TrustManager[] byPassTrustManagers = new TrustManager[]{new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
}};
SSLContext sslContext = null;
SSLSocketFactory sslSocketFactory = null;
try {
sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, byPassTrustManagers, new SecureRandom());
sslSocketFactory = sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
Log.e(TAG, StringUtils.EMPTY, e);
} catch (KeyManagementException e) {
Log.e(TAG, StringUtils.EMPTY, e);
}
return sslSocketFactory;
}
Я знаю, что это небезопасно, но я использую его только для целей тестирования. Вы можете улучшить безопасность, принимая только сертификаты с ваших серверов.