Javax.net.ssl.SSLException: SSL-квитирование отменено. Соединение reset через peer при вызове webservice Android. - программирование
Подтвердить что ты не робот

Javax.net.ssl.SSLException: SSL-квитирование отменено. Соединение reset через peer при вызове webservice Android.

Я звоню https webservice, и его работа прекрасна раньше, но теперь, когда я пытаюсь назвать его, он дает мне следующие ошибки.

Ошибки журнала:

12-23 06:28:11.969: W/System.err(3014): javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x1cc160: I/O error during system call, Connection reset by peer
12-23 06:28:11.979: W/System.err(3014):     at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
12-23 06:28:11.979: W/System.err(3014):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:474)
12-23 06:28:11.979: W/System.err(3014):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.<init>(OpenSSLSocketImpl.java:750)
12-23 06:28:11.979: W/System.err(3014):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:692)
12-23 06:28:11.979: W/System.err(3014):     at crittercism.android.aa.getInputStream(Unknown Source)
12-23 06:28:11.979: W/System.err(3014):     at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:93)
12-23 06:28:11.979: W/System.err(3014):     at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
12-23 06:28:11.979: W/System.err(3014):     at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
12-23 06:28:11.979: W/System.err(3014):     at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
12-23 06:28:11.979: W/System.err(3014):     at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
12-23 06:28:11.979: W/System.err(3014):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:171)
12-23 06:28:11.989: W/System.err(3014):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
12-23 06:28:11.989: W/System.err(3014):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
12-23 06:28:11.989: W/System.err(3014):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
12-23 06:28:11.989: W/System.err(3014):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
12-23 06:28:11.989: W/System.err(3014):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
12-23 06:28:11.989: W/System.err(3014):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)

Я использую следующий код для вызова https webservice.

public static void trustAllHosts() {

        X509TrustManager easyTrustManager = new X509TrustManager() {

            public void checkClientTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {
                // Oh, I am easy!
            }

            public void checkServerTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {
                // Oh, I am easy!
            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

        };

        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { easyTrustManager };

        // Install the all-trusting trust manager
        try {
            SSLContext sc = SSLContext.getInstance("TLS");

            sc.init(null, trustAllCerts, new java.security.SecureRandom());

            HttpsURLConnection
                    .setDefaultSSLSocketFactory(sc.getSocketFactory());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static HttpClient getNewHttpClient() {
        try {
            KeyStore trustStore = KeyStore.getInstance(KeyStore
                    .getDefaultType());
            trustStore.load(null, null);

            SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
            sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

            HttpParams params = new BasicHttpParams();
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

            SchemeRegistry registry = new SchemeRegistry();
            registry.register(new Scheme("http", PlainSocketFactory
                    .getSocketFactory(), 80));
            registry.register(new Scheme("https", sf, 443));

            ClientConnectionManager ccm = new ThreadSafeClientConnManager(
                    params, registry);

            return new DefaultHttpClient(ccm, params);
        } catch (Exception e) {
            return new DefaultHttpClient();
        }
    }

MySSLSocketFactory.java

public class MySSLSocketFactory extends SSLSocketFactory {
    SSLContext sslContext = SSLContext.getInstance("TLS");

    public MySSLSocketFactory(KeyStore truststore)
            throws NoSuchAlgorithmException, KeyManagementException,
            KeyStoreException, UnrecoverableKeyException {
        super(truststore);

        TrustManager tm = new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };

        sslContext.init(null, new TrustManager[] { tm }, null);
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port,
            boolean autoClose) throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, host, port,
                autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
}

Он работает нормально раньше, но теперь он терпит неудачу. На сервере никаких изменений не происходит.

Я уже упоминал

Я тестировал его как в Wi-Fi, так и в мобильных данных. Приложение не работает в обоих.

Если кто-нибудь столкнется с этой проблемой до этого, пожалуйста, помогите мне решить ее.

4b9b3361

Ответ 1

У меня тоже такое исключение. Я обнаружил, что это связано с тем, что протокол TLS 1.0 не поддерживался сервером.

Я заметил, что Android-устройство, http-соединение не удается серверу, на котором TLS 1.0 не поддерживается. Я искал все, что касается ошибки, но не нашел ничего, связанного с этой проблемой. И проблема была решена, когда поддержка TLS 1.0 protocol была добавлена ​​на сервер. Вы можете проверить поддержку протокола сервера/хоста с помощью https://www.ssllabs.com/ssltest.

Ответ 2

Могут быть две причины:

Сертификаты могут быть истекли на стороне клиента или сервера.

Решение: Увеличьте срок действия существующего сертификата или измените новые сертификаты.

Порт сервера был reset для другого порта.

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

Ответ 3

У нас была эта же проблема, начавшаяся сегодня утром, и она была решена.

SSL на IIS 8

  • Все отлично работало вчера и вчера, и наш SSL был обновлен на сайте IIS.
  • При проверке привязки сайта к SSL мы заметили, что в IIS8 установлен новый флажок "Требовать указание имени сервера", он не был проверен, поэтому мы включили его.
  • Это вызвало проблему.
  • Вернулся в IIS, отключил флажок.... проблема решена!

Ответ 4

У меня была такая же проблема для некоторых Android-устройств. Нашел решение с помощью настроек сервера IIS.

Шаги:

  • Открыть IIS
  • Выберите сайт, на котором вы работаете.
  • Изменить привязку сайта
  • Снимите флажок Обязательная идентификация имени сервера
  • Нажмите "ОК"

Сводный снимок экрана:

введите описание изображения здесь

Надеюсь, это поможет вам.