web-dev-qa-db-fra.com

javax.net.ssl.SSLException: établissement de la liaison SSL annulé La connexion a été réinitialisée par un homologue lors de l'appel de Webservice Android.

J'appelle https webservice et cela fonctionne bien avant, mais maintenant, lorsque j'essaie de l'appeler, les erreurs suivantes me sont données.

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. Aucune modification n'a été apportée sur le serveur. 

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

  1. Android-Query - Aléatoire SSLExceptions
  2. Erreurs de réinitialisation intermittente de la connexion par les pairs dans Android lors de la connexion au point de terminaison .NET REST
  3. Exception Android HTTPS Connexion réinitialisée par un homologue
  4. Pourquoi HttpUrlConnection génère-t-il une exception SSLE lors d'une connexion de données mobile?

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

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

16
DreamsNeverDie

J'ai aussi la même exception. J'ai trouvé que c'était dû au protocole TLS 1.0 n'était pas supporté par le serveur. 

J'ai constaté que la connexion http d'un périphérique Android échoue sur le serveur sur lequel TLS 1.0 n'est pas pris en charge. J'ai cherché partout sur le bogue, mais 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 serveur/nom d'hôte à l'aide de https://www.ssllabs.com/ssltest .

28
Ankit

Il pourrait y avoir 2 raisons:

Les certificats peuvent être expirés du côté du client ou du serveur.

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

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

Solution: J'ai rencontré ce problème de changement de port, généralement 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 le fichier wsdl sur son serveur et vérifiez si le port ne correspond pas ou non au wsdl existant côté client. Très probablement, ce serait le cas ici.

3
kingAm

Nous avons eu le 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 protocole SSL a été mis à jour sur le site IIS.
  2. Lors de la vérification du site Liens avec le protocole SSL, nous avons constaté que IIS8 comportait une nouvelle case à cocher "Demander l’indication du nom du serveur".
  3. Cela a déclenché le problème.
  4. Je suis retourné à IIS, désactivé la case à cocher .... problème résolu!
2
Jorge Navarro

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

Pas:

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

Reference screenshot:

 enter image description here

J'espère que cela vous aidera.

1
Hiren Patel