Поддержка HTTPS для сетевой библиотеки Volley Android

У меня есть проект, делающий вызовы REST на бэкэнд HTTPS. Он отлично работает на некоторых устройствах и ломается на других.

Это ошибка, которую я получаю:

com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: квитирование SSL прервано: ssl=0x78004ee8: сбой в библиотеке SSL, обычно ошибка протокола: 140770FCSL подпрограммыSL23_GET_SERVER_HELLO:неизвестный протокол (внешний /openssl/ssl/s23_clnt.c:766 0x731f5d5c:0x00000000)

Глядя на документацию Volley, они упоминают

«Вы можете включить свой собственный HTTPStack (для обработки SSL-соединений [...])»

Кто-нибудь сделал это для залпа? Если да, не могли бы вы поделиться своими изменениями?

Примечания: Сертификат подписан действительным объектом, который уже был в доверенных сертификатах устройств.


person OlivierM    schedule 21.03.2014    source источник
comment
Примечание: для справки, это сетевая библиотека, о которой я говорю: github.com/smanikandan14/Volley-demo   -  person OlivierM    schedule 21.03.2014
comment
К какому порту вы подключаетесь?   -  person 323go    schedule 21.03.2014


Ответы (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;
}

Я знаю, что это небезопасно, но я использую его только для тестирования. Вы можете улучшить безопасность, принимая только сертификаты с ваших серверов.

person Dennis    schedule 31.01.2015
comment
Это не работает в моем проекте. Он говорит Request.finish: - person App Kart; 08.07.2015
comment
@droid_dev: для getSSLSocketFactory вы можете обратиться к мой ответ здесь. Надеюсь это поможет! - person BNK; 05.09.2015