Javax.net.ssl.SSLException: Ошибка чтения: ssl = 0x9524b800: ошибка ввода-вывода во время системного вызова, сброс соединения с помощью одноранговой сети

В течение последних двух недель наши клиенты начинают видеть 100 из этих «SSLException error – Connection reset by peer», и я не могу понять, почему

  1. Мы используем Retrofit с okhttp, никакой специальной конфигурации

    public class OkHttpClientProvider implements IOkHttpClientProvider { OkHttpClient okHttpClient; public OkHttpClientProvider() { this.okHttpClient = createClient(); } public OkHttpClient getOkHttpClient() { return this.okHttpClient; } private OkHttpClient createClient() { return new OkHttpClient(); } } 

Вышеуказанный клиентский провайдер – одноэлементный. RestAdapter построен с использованием этого вложенного клиента (мы используем кинжал) –

 RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder() .setConverter(converter) .setEndpoint(networkRequestDetails.getServerUrl()) .setClient(new OkClient(okHttpClientProvider.getOkHttpClient())) .setErrorHandler(new NetworkSynchronousErrorHandler(eventBus)) ); 

Основываясь на решениях переполнения стеллажей, что я обнаружил –

  1. Продолжительность сохранения на сервере составляет 180 секунд, OkHttp имеет значение по умолчанию 300 секунд

  2. Сервер возвращает «Соединение: закрыть» в своем заголовке, но клиентский запрос отправляет «Connection: keepAlive»

  3. Сервер поддерживает TLS 1.0 / 1.1 / 1.2 и использует Open SSL

  4. Наши серверы недавно перешли на другой хостинг-провайдер в другой географии, поэтому я не знаю, являются ли эти сбои DNS или нет

  5. Мы попытались настроить такие вещи, как keepAlive, перенастроить OpenSSL на сервере, но по какой-то причине клиент Android продолжает получать эту ошибку

  6. Это происходит сразу же без каких-либо задержек, когда вы пытаетесь использовать приложение для публикации чего-либо или для обновления (он даже не входит в сеть или не задерживается до того, как это исключение произойдет, что будет означать, что соединение уже нарушено). Но пытаюсь это несколько раз как-то «исправляет», и мы добиваемся успеха. Это происходит позже

  7. Мы аннулировали наши записи DNS на сервере, чтобы убедиться, что это вызвало это, но это не помогло

  8. В основном это происходит на LTE, но я видел его и на Wi-Fi.

Я не хочу отключать поддержку, потому что большинство современных клиентов этого не делают. Также мы используем OkHttp 2.4, и это проблема на почтовых устройствах сэндвич-мороженого, поэтому я надеюсь, что он должен позаботиться об этих проблемах с сетью. Клиент iOS также получает эти исключения, но близок к 100 раз (клиент iOS использует AFNetworking 2.0). Я изо всех сил пытаюсь найти новые вещи, чтобы попытаться в этот момент, любую помощь / идеи?

Обновление – добавление полной трассировки стека через okhttp

  retrofit.RetrofitError: Read error: ssl=0x9dd07200: I/O error during system call, Connection reset by peer at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:390) at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240) at java.lang.reflect.Proxy.invoke(Proxy.java:397) at $Proxy15.getAccessTokenUsingResourceOwnerPasswordCredentials(Unknown Source) at com.company.droid.repository.network.NetworkRepository.getAccessTokenUsingResourceOwnerPasswordCredentials(NetworkRepository.java:76) at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:88) at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:23) at android.os.AsyncTask$2.call(AsyncTask.java:292) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by: javax.net.ssl.SSLException: Read error: ssl=0x9dd07200: I/O error during system call, Connection reset by peer at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method) at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:699) at okio.Okio$2.read(Okio.java:137) at okio.AsyncTimeout$2.read(AsyncTimeout.java:211) at okio.RealBufferedSource.indexOf(RealBufferedSource.java:306) at okio.RealBufferedSource.indexOf(RealBufferedSource.java:300) at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196) at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191) at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80) at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:917) at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:793) at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:439) at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384) at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497) at com.squareup.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105) at com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:25) at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73) at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38) at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)            at java.lang.reflect.Proxy.invoke(Proxy.java:397)            at $Proxy15.getAccessTokenUsingResourceOwnerPasswordCredentials(Unknown Source)            at com.company.droid.repository.network.NetworkRepository.getAccessTokenUsingResourceOwnerPasswordCredentials(NetworkRepository.java:76)            at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:88)            at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:23)            at android.os.AsyncTask$2.call(AsyncTask.java:292)            at java.util.concurrent.FutureTask.run(FutureTask.java:237)            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)            at java.lang.Thread.run(Thread.java:818) ]} 

Недавно я столкнулся с проблемой, работая над некоторым устаревшим кодом. После googling я обнаружил, что проблема существует повсюду, но без какой-либо конкретной резолюции. Я работал над различными частями сообщения об исключениях и анализировался ниже.

Анализ:

  1. SSLException : исключение произошло с SSL (Secure Socket Layer), который реализован в пакете javax.net.ssl JDK ( openJDK/oracleJDK/AndroidSDK )
  2. Read error ssl=# I/O error during system call : при чтении из безопасного сокета произошла ошибка. Это произошло при использовании собственных системных библиотек / драйверов. Обратите внимание: все платформы Solaris, Windows и т. Д. Имеют свои собственные библиотеки сокетов, которые используются SSL. Windows использует библиотеку WINSOCK.
  3. Connection reset by peer : это сообщение сообщается системной библиотекой (Solaris сообщает ECONNRESET , отчеты Windows WSAECONNRESET ), что сокет, используемый при передаче данных, больше не используется, поскольку существующее соединение было принудительно закрыто удаленным хостом. Нужно создать новый безопасный путь между хостом и клиентом

Причина:

Понимая проблему, я пытаюсь найти причину перезагрузки соединения, и я пришел к следующим причинам:

  • Одноранговое приложение на удаленном хосте внезапно прекращается, хост перезагружается, хост или удаленный сетевой интерфейс отключен, или удаленный хост использует жесткое закрытие.
  • Эта ошибка может также возникнуть, если соединение было нарушено из-за активности keep-alive, обнаруживающей отказ при выполнении одной или нескольких операций. Network dropped connection on reset(On Windows( WSAENETRESET )) операции Network dropped connection on reset(On Windows( WSAENETRESET )) неудачей с Network dropped connection on reset(On Windows( WSAENETRESET )) а последующие операции Network dropped connection on reset(On Windows( WSAENETRESET )) неудачей с Connection reset by peer(On Windows( WSAECONNRESET )) с Connection reset by peer(On Windows( WSAECONNRESET )) .
  • Если целевой сервер защищен брандмауэром, что истинно в большинстве случаев, время жизни (TTL) или тайм-аут, связанные с портом, принудительно закрывают незанятое соединение при заданном тайм-ауте. Это наш интерес

Разрешение:

  1. События на стороне сервера, такие как внезапный останов обслуживания, перезагрузка, отключенный сетевой интерфейс, не могут быть обработаны никакими средствами.
  2. На стороне сервера настройте брандмауэр для данного порта с более высоким временем жизни (TTL) или значениями тайм-аута, например 3600 секунд.
  3. Клиенты могут «попытаться» поддерживать активную сеть, чтобы избежать или уменьшить Connection reset by peer .
  4. Обычно при запуске сетевого трафика поддерживается соединение, и проблема / исключение часто не видны. У сильного Wifi меньше всего шансов на Connection reset by peer .
  5. С мобильными сетями 2G, 3G и 4G, где доставка пакетных данных является прерывистой и зависит от доступности мобильной сети, она не может сбрасывать таймер TTL на стороне сервера и приводит к Connection reset by peer сеть.

Ниже приведены термины, предлагаемые на разных форумах для решения проблемы.

  • ConnectionTimeout: Используется только в момент времени, связанного с подключением. Если хост требует времени для подключения, это означает, что клиент ожидает подключения.
  • SoTimeout : SoTimeout аут SoTimeout . В нем указано максимальное время, в течение которого принимается пакет данных, чтобы считать соединение активным. Если данные не были получены в течение заданного времени, соединение считается заторможенным / сломанным.
  • Linger : до того момента, когда сокет не должен закрываться при отправке данных в очередь, и в сокете вызывается функция закрытия сокета.
  • TcpNoDelay : вы хотите отключить буфер, который содержит и накапливает TCP-пакеты, и отправлять их после достижения порогового значения? Установка этого значения в true будет пропускать буферизацию TCP, чтобы каждый запрос был отправлен немедленно. Замедление в сети может быть вызвано увеличением сетевого трафика из-за более низкой и более частой передачи пакетов.

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

Я нашел один параметр, который может помочь решить проблему, которая является этими функциями

 setKeepAlive(true) setSoKeepalive(HttpParams params, enableKeepalive="true") 

Как я разрешил свою проблему?

  • Установите HttpConnectionParams.setSoKeepAlive(params, true)
  • Поймайте SSLException и проверьте сообщение об SSLException для Connection reset by peer
  • Если обнаружено исключение, сохраните процесс загрузки / чтения и создайте новое соединение.
  • Если возможно, возобновите загрузку / чтение, перезапустите загрузку

Я надеюсь, что детали помогут. Счастливое кодирование …

Сканируйте свой домен на этом sslTesturl и посмотрите, разрешено ли подключение для вашей версии устройства.

Если устройства с более низкой версией (например, <Android 4.4.2 и т. Д.) Не могут подключиться из-за поддержки TLS, попробуйте добавить это в свой конфигурационный файл Nginx,

 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 

У нас была такая же проблема, начиная с сегодняшнего утра, и она решена … надеюсь, что это поможет …

SSL на IIS 8

  1. Вчера все было хорошо, и вчера мы обновили SSL на сайте IIS.
  2. При проверке сайта Bindings на SSL заметили, что IIS8 имеет новый флажок « Требовать имя имени сервера» , он не был проверен так, чтобы ему было предложено его включить.
  3. Это вызвало проблему.
  4. Вернулся в IIS, отключил флажок …. Проблема решена !!!!

Надеюсь это поможет!!!

Intereting Posts
Android: измерение высоты текста на холсте Метаданные вращения видео Mp4 Использование LayoutInflater с использованием контекста Как предотвратить изменение ориентации при наклоне устройства? Вытащить базу данных из эмулятора genymotion на локальный диск Android – программно изменяет локализацию системы устройств Android-тесты – Как добавить журналы Espresso Получение net :: ERR_UNKNOWN_URL_SCHEME при вызове номера телефона с HTML-страницы в Android Как реализовать Flipboard ipad для поворота страницы для просмотра flipper в android? Информация об устройстве Android Как сделать противоположность атрибута предпочтения android: зависимость? Каков способ вставки огромных данных JSON в SQLite DB в андроид Не удалось найти местоположение Android SDK для настройки предпочтения Eclipse Уведомление Android не будет отклонено при нажатии / прокрутке Почему я получаю NullPointerException при отправке SMS на HTC Desire или что такое SubmitPdu?