javax. net. ssl. SSLException: Connexion interrompue par la connexion par un pair lors de l'appel de webservice Android


J'appelle https webservice et ça marche bien avant, mais maintenant quand j'essaie de l'appeler, ça me donne des erreurs suivantes.

Erreurs de journal:

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)

J'utilise le code suivant pour appeler le service Web https.

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

Cela fonctionne bien avant, mais maintenant il échoue. Il n'y a aucune modification apportée au serveur.

J'ai déjà fait référence à

  1. Android-Requête - SSLExceptions aléatoires
  2. Réinitialisation intermittente de la connexion par des erreurs de pairs dans la connexion Android au point de terminaison REST. NET
  3. Connexion d'exception HTTPS Android réinitialisée par le pair
  4. Pourquoi HttpUrlConnection lance-t-il une SSLException sur une connexion de données mobile?

Je l'ai testé à la fois en wifi et en données mobiles. L'application ne fonctionne pas dans les deux.

Si quelqu'un fait face à ce problème avant, aidez-moi à le résoudre il.

Author: Community, 2013-12-23

4 answers

J'ai également eu la même exception. J'ai trouvé que c'était dû à Le protocole TLS 1.0 n'était pas pris en charge par le serveur.

J'ai observé que l'appareil Android, la connexion http échoue sur le serveur où TLS 1.0 n'est pas pris en charge. J'ai cherché partout sur le bug, mais je n'ai rien trouvé lié à ce problème. Et le problème a été résolu, lorsque le support TLS 1.0 protocol a été ajouté au serveur.Vous pouvez vérifier la prise en charge du protocole de votre serveur / nom d'hôte en utilisant https://www.ssllabs.com/ssltest.

 28
Author: Ankit, 2013-12-23 14:34:20

Il pourrait y avoir 2 raisons:

Les certificats peuvent expirer à la fin du client ou du serveur.

Solution: Prolongez la date d'expiration du certificat existant ou échangez de nouveaux certificats.

Le port du serveur a été réinitialisé à un autre port.

Solution: J'ai fait face à ce problème de changement de port, normalement dû à la maintenance du serveur ou à la mise à jour des correctifs, parfois le port du service est modifié. Demandez à la personne qui vous a fourni le wsdl de régénérer wsdl sur son serveur et vérifiez le port non s'il correspond à wsdl existant côté client ou non. Très probablement ce serait le cas ici.

 4
Author: kingAm, 2013-12-23 11:01:27

Nous avons eu ce même problème à partir de ce matin et l'avons résolu.

SSL sur IIS 8

  1. Tout fonctionnait bien hier et hier soir, notre SSL a été mis à jour sur le site IIS.
  2. Lors de la vérification des liaisons de site au SSL, nous avons remarqué qu'IIS8 avait une nouvelle case à cocher "Exiger l'indication du nom du serveur", elle n'a pas été cochée, nous avons donc procédé à son activation.
  3. Qui a déclenché le problème.
  4. Est retourné à IIS, désactivé la case à cocher.... problème résolu!
 2
Author: Jorge Navarro, 2015-10-13 16:51:03

J'avais le même problème pour certains appareils Android. Trouvé la solution par Paramètres du serveur IIS .

Suit:

  1. Ouvrir IIS
  2. Sélectionnez le site sur lequel vous travaillez
  3. Modifier la liaison du site
  4. Décochez L'Identification requise du nom du serveur
  5. Cliquez sur OK

Capture d'écran de référence:

entrez la description de l'image ici

Espère que ce serait vous aide.

 2
Author: Hiren Patel, 2017-07-11 08:04:14