Ssl handshake aborted error during system call connection reset by peer

javax.net.ssl.SSLException: Read error: ssl=0x8ad9c2c0: I/O error during system call, Connection reset by peer #3594 Comments I try to make a http post request. Okhttp throws an sslexception. So I add some codes to trust all certificates. ResponseBody body = response.body(); int statusCode = response.code(); byte[] bodyBytes = body.bytes(); // **The exception occurs on this […]

Содержание

  1. javax.net.ssl.SSLException: Read error: ssl=0x8ad9c2c0: I/O error during system call, Connection reset by peer #3594
  2. Comments
  3. javax.net.ssl.SSLException: ошибка чтения: ssl = 0x9524b800: ошибка ввода-вывода во время системного вызова, сброс соединения одноранговым узлом

javax.net.ssl.SSLException: Read error: ssl=0x8ad9c2c0: I/O error during system call, Connection reset by peer #3594

I try to make a http post request. Okhttp throws an sslexception. So I add some codes to trust all certificates.

ResponseBody body = response.body(); int statusCode = response.code(); byte[] bodyBytes = body.bytes(); // **The exception occurs on this line**

Okhttp version is here

Trace is here:
javax.net.ssl.SSLException: Read error: ssl=0x8797a780: I/O error during system call, Connection reset by peer 09-11 11:56:44.811 25238-29849/ D/OkHttp: at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method) 09-11 11:56:44.811 25238-29849/ D/OkHttp: at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:758) 09-11 11:56:44.811 25238-29849/ D/OkHttp: at okio.Okio$2.read(Okio.java:139) 09-11 11:56:44.811 25238-29849/ D/OkHttp: at okio.AsyncTimeout$2.read(AsyncTimeout.java:237) 09-11 11:56:44.811 25238-29849/ D/OkHttp: at okio.RealBufferedSource.read(RealBufferedSource.java:46) 09-11 11:56:44.811 25238-29849/ D/OkHttp: at okhttp3.internal.http1.Http1Codec$FixedLengthSource.read(Http1Codec.java:384) 09-11 11:56:44.812 25238-29849/ D/OkHttp: at okio.Buffer.writeAll(Buffer.java:1005) 09-11 11:56:44.812 25238-29849/ D/OkHttp: at okio.RealBufferedSource.readByteArray(RealBufferedSource.java:107) 09-11 11:56:44.812 25238-29849/ D/OkHttp: at okhttp3.ResponseBody.bytes(ResponseBody.java:136)

I think this is not a server side problem. I just tried, volley works for same request.

The text was updated successfully, but these errors were encountered:

Источник

javax.net.ssl.SSLException: ошибка чтения: ssl = 0x9524b800: ошибка ввода-вывода во время системного вызова, сброс соединения одноранговым узлом

Наши клиенты начинают видеть сотни таких сообщений «Ошибка SSLException — сброс соединения одноранговым узлом» за последние пару недель, и я не могу понять, почему

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Анализ:

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

Причина:

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

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

Разрешение:

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

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

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

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

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

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

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

Надеюсь, подробности помогут. Удачного кодирования .

Источник

Android 4.x Запрос на мобильный телефон HTTPS бросает следующее исключение:

javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x63a76008: I/O error during system call, Connection reset by peer
        at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
        at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:406)
        at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:318)
        at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:282)
        at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:167)
        at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
        at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
        at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at com.luckyshane.cnblogs.model.api.GankApi$1.intercept(GankApi.java:64)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:147)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        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:841)

Тестируйте мобильный телефон API 19 Huawei CHM-UL00, URL-адрес запроса теста:https://gank.io/api/today。

После многих других результатов поиска причина примерно такова:

  1. Сервер поддерживает только версии TLS V1.1 и TLS V1.2
  2. Устройства Android4.x (16 <= API <20) Хотя TLSV1.1 и TLSV1.2 поддерживаются, они не включены. Таким образом, переговоры по рукопожатию HTTPS не удалось.

https://developer.android.com/reference/javax/net/ssl/SSLSocketПоддержка протокола SSL (SSL, TLS) протокола указана выше. следующим образом:

Client socket:

Protocol Supported (API Levels) Enabled by default (API Levels)
SSLv3 1-25 1-22
TLSv1 1+ 1+
TLSv1.1 16+ 20+
TLSv1.2 16+ 20+

Server socket:

Protocol Supported (API Levels) Enabled by default (API Levels)
SSLv3 1-25 1-22
TLSv1 1+ 1+
TLSv1.1 16+ 16+
TLSv1.2 16+ 16+

Решение:

  1. Сервер поддерживает старую версию TLS V1.0. Этот старый телефон может быть поддержан.
  2. 4.x Устройства поддерживали TLSV1.1 и TLSV1.2, просто не включены. Так что я хочу включить это.

В случае, когда сервер неконтролируемый, вы можете учитывать только обработку клиента, поэтому эта статья будет введена, как включить TLSV1.2 на клиенте Android для старой версии (базовый сервер поддерживает это, может быть основан на фактическом Ситуация обрабатывается).

Есть много статей в Интернете, чтобы представить эту часть, источник решения должен быть здесьhttps://github.com/square/okhttp/issues/2372。

В сочетании с личной практикой, чтобы представить:

Определите SSLSocketFactoryCompat, если вы 4.x Устройство при создании сокета, вы включаете TLSV1.2

import android.os.Build;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

public class SSLSocketFactoryCompat extends SSLSocketFactory{
    private static final String[] TLS_V12_ONLY = {"TLSv1.2"};

    private final SSLSocketFactory delegate;

    public SSLSocketFactoryCompat() throws KeyManagementException, NoSuchAlgorithmException {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, null, null);
        delegate = sc.getSocketFactory();
    }

    public SSLSocketFactoryCompat(SSLSocketFactory delegate) {
        if (delegate == null) {
            throw new NullPointerException();
        }
        this.delegate = delegate;
    }
    
    @Override
    public String[] getDefaultCipherSuites() {
        return delegate.getDefaultCipherSuites();
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return delegate.getSupportedCipherSuites();
    }

    private Socket enableTls12(Socket socket) {
        if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 20) {
            if (socket instanceof SSLSocket) {
                ((SSLSocket) socket).setEnabledProtocols(TLS_V12_ONLY);
            }
        }
        return socket;
    }

    @Override
    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
        return enableTls12(delegate.createSocket(s, host, port, autoClose));
    }

    @Override
    public Socket createSocket(String host, int port) throws IOException {
        return enableTls12(delegate.createSocket(host, port));
    }

    @Override
    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {
        return enableTls12(delegate.createSocket(host, port, localHost, localPort));
    }

    @Override
    public Socket createSocket(InetAddress host, int port) throws IOException {
        return enableTls12(delegate.createSocket(host, port));
    }

    @Override
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
        return enableTls12(delegate.createSocket(address, port, localAddress, localPort));
    }
}

Если клиент имеет случай предоставления SSLSOCKEETFactoractory (например, клиент загружен вашим собственным сертификатом, вы предоставите SSLSocketFactory, а затем использовать SSLSocketFactoryCompat, чтобы упаковать свои собственные SSLSocketFactory и установить его. Если нет, используйте нефинансированный конструктор SSLSocketFactoryCompat. Отказ

Вышеуказанный класс можно использовать для OKHTTP, или другие HTTP должны устанавливать SSLSocketFactory.

Использование OKHTTP

// не предоставляем дополнительные сертификаты
public static OkHttpClient getOkHttpClient() {
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    try {
        SSLSocketFactory factory = new SSLSocketFactoryCompat();
        builder.sslSocketFactory(factory);
    } catch (KeyManagementException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return builder.build();
}

Обеспечить дополнительные сертификаты:

// Тест в каталоге активов содержит сертификат Gank.Cer, вы можете обрабатывать его в соответствии с вашей собственной ситуацией.
private static OkHttpClient getOkHttpClientSSL() {
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    InputStream cerInputStream;
    try {
        cerInputStream = App.getInstance().getAssets().open("gank.cer");
        SSLSocketFactory socketFactory = getSocketFactory(cerInputStream);
        builder.sslSocketFactory(new SSLSocketFactoryCompat(socketFactory));
    } catch (IOException e) {
        e.printStackTrace();
    }
    return builder.build();
}

 // Создать SSLSocketFactory в соответствии с сертификатом, поддерживать несколько сертификатов
private static SSLSocketFactory getSocketFactory(InputStream... certificates) {
    KeyStore keyStore;
    try {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null);
        int index = 0;
        for (InputStream certificate : certificates) {
            String certificateAlias = Integer.toString(index++);
            keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
        }
        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManagerFactory trustManagerFactory =
                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);
        sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
        return sslContext.getSocketFactory();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    } finally {
        for (InputStream certificate : certificates) {
            try {
                certificate.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return null;
}

HTTPSURLConnection простой тест

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            URL url = new URL("https://gank.io/api/today");
            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
            connection.setSSLSocketFactory(new SSLSocketFactoryCompat());
            InputStream inputStream = connection.getInputStream();
            String result = IoUtils.readAllChars(new InputStreamReader(inputStream));
            LogUtils.json(result);
            inputStream.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
    }
}).start();
  • Thread starter
    Shay

  • Start date
    Oct 20, 2016

  • Similar Threads
    Similar Threads

Shay

Shay

Well-Known Member


  • #1

Hi

Using HTTPS,
library OkHTTPUtils2 2.20 + OkHTTP 1.01

Sub ExecuteRemoteQuery(Query As String, JobName As String)
    Dim Job As HttpJob
   
    If Job.IsInitialized = False Then
     Job.Initialize(JobName, Me)
    End If
    ProgressDialogShow2("getting data, just a sec ...",False)
    Job.PostString(Starter.SSLIP & "Main.php", Query)
    Job.GetRequest.Timeout = 30000

End Sub

Working on some phones without issue
On some sometimes works, and on some never works

also I added the timeout — seems it has no affect — it is not waiting 30 sec. not even 1 sec

getting the following errors:
** Service (starter) Create **
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
** Service (httputils2service) Create **
** Service (httputils2service) Start **
Main, Error: javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x4f8c3028: I/O error during system call, Connection reset by peer
Main, Error: javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x4fa2f560: I/O error during system call, Connection reset by peer
Main, Error: javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x4f9cc5a8: I/O error during system call, Connection reset by peer
** Activity (main) Pause, UserClosed = true **
** Service (starter) Destroy **

KMatle


  • #2

It seems that the server disconnects. Can you take a look to the server log?

Did you check the difference between the devices? (OS version/Connection speed)? Maybe the server isn’t waiting long enough.

Shay

Shay

Well-Known Member


  • #3

it is not my server, but on android 6.01 I see 1 error (I have automatic 3 retires)
on lower versions it fails 3/3
do you think the issue cannot be solved on client side?

KMatle


Shay

Shay

Well-Known Member


  • #5

Yes, I saw this, I am checking now with the server host company
but do you know how do I enable this:
setSoKeepAlive

  • set the HttpConnectionParams.setSoKeepAlive(params, true)

KMatle


  • #6

@Erel : Could you help here please?

Erel


  • #7

The server is probably using a SSL encryption protocol that is not supported by the older device.

HttpConnectionParams is not related to OkHttp. It is part of HttpClient API.

Shay

Shay

Well-Known Member


  • #8

I don’t have access to the hosting server, how can I overcome this?

Erel


  • #9

You can try to use HttpUtils2 instead of OkHttpUtils2. If it doesn’t work then there isn’t much that you can do about it.

Понравилась статья? Поделить с друзьями:
  • Ssl get error 6 nginx
  • Ssl error что это такое
  • Ssl error терминал
  • Ssl error на терминале
  • Ssfiv exe системная ошибка