com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL рукопожатие прервано:

Я использую библиотеку Volley в Android в своем приложении и при попытке сделать POST-запросы к нашему серверу я получаю следующую ошибку:

com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x6821edb0: Failure in SSL library, usually a protocol error
error:1407743E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert inappropriate fallback (external/openssl/ssl/s23_clnt.c:744 0x5f4c0c46:0x00000000)

Наш сервер подписан следующим сертификатом SSL:

i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
1 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
 2 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root

Сертификат описывается openssl следующим образом:

New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA

Я проверил шифры с шифрованием поверх Android и они говорят, что он включен по умолчанию.

Я пробовал следующее решение этой проблемы, но ни один из них не решил ее:

Поддержка HTTPS для сетевой библиотеки Volley Android - не работает (также не подходит для меня, так как это небезопасно)

Как отключить SSLv3 в Android для HttpsUrlConnection? - Я попробовал это, ошибка все еще происходит

Android Api, используемый в нашем проекте, - это Android 5.1 (API 22). Версия библиотеки Volley - 1.0.15 (также пробовал с последней версией 1.0.18, но проблема все еще возникает).

Еще одно решение, которое я пробовал - использовать библиотеку okhttp, интегрированную с Volley, но проблема все еще возникает.

Любое рабочее решение будет высоко ценится.

Заранее спасибо!

ОБНОВИТЬ

Кстати, мне удалось получить поддерживаемые шифры с сервера:

Supported cipher suites (ORDER IS NOT SIGNIFICANT):
  SSLv3
     RSA_WITH_RC4_128_MD5
     RSA_WITH_RC4_128_SHA
     RSA_WITH_IDEA_CBC_SHA
     RSA_WITH_3DES_EDE_CBC_SHA
     DHE_RSA_WITH_3DES_EDE_CBC_SHA
     RSA_WITH_AES_128_CBC_SHA
     DHE_RSA_WITH_AES_128_CBC_SHA
     RSA_WITH_AES_256_CBC_SHA
     DHE_RSA_WITH_AES_256_CBC_SHA
     RSA_WITH_CAMELLIA_128_CBC_SHA
     DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
     RSA_WITH_CAMELLIA_256_CBC_SHA
     DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
     TLS_RSA_WITH_SEED_CBC_SHA
     TLS_DHE_RSA_WITH_SEED_CBC_SHA
  (TLSv1.0: idem)
  (TLSv1.1: idem)
  TLSv1.2
     RSA_WITH_RC4_128_MD5
     RSA_WITH_RC4_128_SHA
     RSA_WITH_IDEA_CBC_SHA
     RSA_WITH_3DES_EDE_CBC_SHA
     DHE_RSA_WITH_3DES_EDE_CBC_SHA
     RSA_WITH_AES_128_CBC_SHA
     DHE_RSA_WITH_AES_128_CBC_SHA
     RSA_WITH_AES_256_CBC_SHA
     DHE_RSA_WITH_AES_256_CBC_SHA
     RSA_WITH_AES_128_CBC_SHA256
     RSA_WITH_AES_256_CBC_SHA256
     RSA_WITH_CAMELLIA_128_CBC_SHA
     DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
     DHE_RSA_WITH_AES_128_CBC_SHA256
     DHE_RSA_WITH_AES_256_CBC_SHA256
     RSA_WITH_CAMELLIA_256_CBC_SHA
     DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
     TLS_RSA_WITH_SEED_CBC_SHA
     TLS_DHE_RSA_WITH_SEED_CBC_SHA
     TLS_RSA_WITH_AES_128_GCM_SHA256
     TLS_RSA_WITH_AES_256_GCM_SHA384
     TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
     TLS_DHE_RSA_WITH_AES_256_GCM_SHA384

Из того, что я прочитал, не должно быть проблем с этими шифрами в API LVL 22.

1 ответ

Решение

Я обнаружил проблему после нескольких часов поиска в Интернете и кода проекта: внутри проекта у меня есть класс с именем JsonToPOJORequest<T>, что расширяет класс волейбола JsonRequest<T>, Это класс, который фактически делает запрос для каждого метода на сервере. Немного проанализировав код, я нашел вызов метода внутри конструктора следующим образом:

setRetryPolicy(new DefaultRetryPolicy(3*DefaultRetryPolicy.DEFAULT_TIMEOUT_MS, 0, 0));

где DefaultRetryPolicy.DEFAULT_TIMEOUT_MS установлено как 2500 мс.

Поскольку в запросе POST было много данных, отправка запроса и получение ответа от сервера занимает больше времени.

Кажется, что Volley не дождался ответа и выдает ошибку TimeoutError. Итак, запрос сделан, на сервере все идет хорошо, но клиент (Android) не ждет сервера и выдает ошибку.

Решением было установить для параметра Timeout значение выше или 0, например:

setRetryPolicy(new DefaultRetryPolicy(5*DefaultRetryPolicy.DEFAULT_TIMEOUT_MS, 0, 0));
setRetryPolicy(new DefaultRetryPolicy(0, 0, 0));

Остались два вопроса:

1) Почему запрос занимает так много времени? -> 3*2500 = 7500мс - достаточно много времени (более 7 секунд), чтобы сделать запрос. И это не проблема сервера, так как на iOS это работает просто отлично.

2) Почему VolleyError выглядит так?

com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted:

Должно быть TimeoutError, а не NoConnectionError.

Вы можете найти больше информации об этой ошибке здесь, где я также вывел решение: Android Volley двойной пост, когда есть медленный запрос

https://groups.google.com/forum/

Решение состоит в том, чтобы увеличить тайм-аут запроса залпа с помощью этой строки кода.

request.setRetryPolicy(новый DefaultRetryPolicy(10 * 1000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Приведенный выше код является тайм-аутом запроса на настройку до 10 секунд.

Другие вопросы по тегам