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(); } } 

Вышеуказанный клиентский провайдер – это singleton. 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 ECONNRESET : это сообщение сообщается системной библиотекой (Solaris сообщает ECONNRESET , Windows сообщает WSAECONNRESET ), что сокет, используемый при передаче данных, больше не может использоваться, поскольку существующее соединение было принудительно закрыто удаленным хостом. Нужно создать новый безопасный путь между хостом и клиентом

Причина:

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

  • Одноранговое приложение на удаленном хосте внезапно прекращается, хост перезагружается, хост или удаленный сетевой интерфейс отключен, или удаленный хост использует жесткое закрытие.
  • Эта ошибка может также возникнуть, если соединение было нарушено из-за активности сохранения активности при обнаружении сбоя при выполнении одной или нескольких операций. 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 аут Socket – указывает максимальное время, в течение которого пакет данных принимается, чтобы считать соединение активным. Если данные не были получены в течение заданного времени, соединение считается заторможенным / сломанным.
  • Linger : до того момента, когда сокет не должен закрываться при отправке данных в очередь, и в сокете вызывается функция закрытия сокета.
  • TcpNoDelay : вы хотите отключить буфер, который содержит и накапливает TCP-пакеты, и отправлять их после достижения порогового значения? Установка этого значения в true будет пропускать буферизацию TCP, чтобы каждый запрос был отправлен немедленно. Замедление в сети может быть вызвано увеличением сетевого трафика из-за более низкой и более частой передачи пакетов.

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

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

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

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

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

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

Если вы используете Nginx и получаете аналогичную проблему, это может помочь:

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

Если устройства с более низкой версией (например,

 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 

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

SSL на IIS 8

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

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

Другой возможной причиной этого сообщения об ошибке является то, что HTTP-метод блокируется сервером или балансировщиком нагрузки.

Кажется, что стандартная практика безопасности блокирует неиспользуемые HTTP-методы. Мы столкнулись с этим, потому что HEAD блокировался балансировщиком нагрузки (но, как ни странно, не все серверы с балансировкой нагрузки, из-за которых он проваливался только некоторое время). Я смог проверить, что сам запрос работал нормально, временно изменив его, чтобы использовать метод GET.

Код ошибки в iOS: Ошибка запроса кода приложения: Ошибка домена = NSURLErrorDomain Code = -1005 «Сетевое соединение было потеряно».

  • Как всегда разрешать небезопасное соединение для определенного URL-адреса в хроме?
  • По умолчанию SecurityProtocol в .NET 4.5
  • Firefox: это соединение не доверено + За корпоративным брандмауэром
  • Динамические изображения, переданные через HTTPS, отображают сломанное изображение в слове при открытии HTTP-документа
  • Apache HttpClient на Android, производящем CertPathValidatorException (имя_отчета! = Имя_почты)
  • Как импортировать существующий сертификат x509 и закрытый ключ в хранилище ключей Java для использования в SSL?
  • Как создать формат BKS (BouncyCastle) Java Keystore, который содержит цепочку сертификатов клиента
  • Тип Keystore: какой из них использовать?
  • Что происходит на проводе при настройке соединения TLS / LDAP или TLS / HTTP?
  • Как я могу различать эти две ситуации сертификата?
  • Как установить доверенный сертификат CA на Android-устройство?
  • Давайте будем гением компьютера.