web-dev-qa-db-fra.com

javax.net.ssl.SSLHandshakeException: Connexion fermée par un homologue à l'adresse com.Android.org.conscrypt.NativeCrypto.SSL_do_handshake (méthode native)

avant le niveau 24 de l'api, mon code fonctionne bien, mais il me donne une erreur au niveau 24 (7,0 Nougat) de l'API. Je ne comprends pas ce qui ne va pas avec mon code.

La première approche est ici:

 <?xml version="1.0" encoding="utf-8"?> <network-security-config>
   <base-config> <trust-anchors> <certificates src="system"/>
   <certificates src="user"/> </trust-anchors> </base-config>
   <domain-config> <domain includeSubdomains="true">xyz.com</domain>
   <trust-anchors> <certificates src="@raw/my_ca"/> </trust-anchors>
   </domain-config> </network-security-config>

Dans le fichier manifeste: 

Android:network Security Config = "@xml/network_security_config" J'ai inclus network_security_config à l'intérieur de res/xml/network_security_config et le certificat ca est à l'intérieur de res/raw/my_ca.pem

La deuxième approche est là:

 import org.Apache.http.client.HttpClient; 
 import org.Apache.http.conn.ClientConnectionManager;  
 import org.Apache.http.conn.scheme.Scheme; 
 import org.Apache.http.conn.scheme.SchemeRegistry; 
 import org.Apache.http.conn.ssl.SSLSocketFactory; 
 import org.Apache.http.impl.client.DefaultHttpClient; 
 import Java.io.IOException; import Java.net.Socket; 
 import Java.net.UnknownHostException; 
 import Java.security.KeyManagementException; 
 import Java.security.KeyStore;
 import Java.security.KeyStoreException; 
 import Java.security.NoSuchAlgorithmException; 
 import Java.security.UnrecoverableKeyException; 
 import Java.security.cert.CertificateException; 
 import Java.security.cert.X509Certificate; import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManager; 
 import javax.net.ssl.X509TrustManager; 
    public class ExSSLSocketFactory extends SSLSocketFactory { 
      SSLContext sslContext = SSLContext.getInstance("TLS"); 
      public ExSSLSocketFactory(KeyStore truststore) throws 
         NoSuchAlgorithmException, KeyManagementException,KeyStoreException,
         UnrecoverableKeyException {
         super(truststore);
     TrustManager x509TrustManager = 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[] {
     x509TrustManager }, null);
 } public ExSSLSocketFactory(SSLContext
     context) throws KeyManagementException, NoSuchAlgorithmException,
     KeyStoreException, UnrecoverableKeyException {
 super(null); 
sslContext = context; 
} @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(); 
}
     public static HttpClient getHttpsClient(HttpClient client) { 
try{
     X509TrustManager x509TrustManager = new X509TrustManager() 
{ 
@Override
     public void checkClientTrusted(X509Certificate[] chain, String
     authType) throws CertificateException { }
 @Override public void
     checkServerTrusted(X509Certificate[] chain, String authType) throws
     CertificateException {
 }
 @Override public X509Certificate[]
     getAcceptedIssuers() { 
return null; 
}
 }; 
SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new
     TrustManager[]{x509TrustManager}, null); SSLSocketFactory
     sslSocketFactory = new ExSSLSocketFactory(sslContext);
     sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
     ClientConnectionManager clientConnectionManager =
     client.getConnectionManager(); SchemeRegistry schemeRegistry =
     clientConnectionManager.getSchemeRegistry();
     schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
     return new DefaultHttpClient(clientConnectionManager,
     client.getParams()); 
} catch (Exception ex) 
{ return null; 
} } }

En établissant une connexion http:

public String CallWebService(String url, String soapAction, String envelope){


final HttpClient httpClient = ExSSLSocketFactory.getHttpsClient(new DefaultHttpClient());
    HttpParams params = httpClient.getParams();
    HttpConnectionParams.setConnectionTimeout(params, 150000);
    HttpConnectionParams.setSoTimeout(params, 150000);
    HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), true);
    HttpPost httppost = new HttpPost(url);
    httppost.setHeader("soapaction", soapAction);
    httppost.setHeader("Content-Type", "text/xml; charset=utf-8");

    String responseString = "";
    try
    {
        HttpEntity entity = new StringEntity(envelope);
        httppost.setEntity(entity);
        ResponseHandler<String> rh = new ResponseHandler<String>()
        {

            public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException
            {

                HttpEntity entity = response.getEntity();
                StringBuffer out = new StringBuffer();
                byte[] b = EntityUtils.toByteArray(entity);
                out.append(new String(b, 0, b.length));
                return out.toString();
            }
        };

        responseString = httpClient.execute(httppost, rh);
        Log.d("Response is here....", "responseString :  " + responseString);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    // close the connection
    httpClient.getConnectionManager().shutdown();
    return responseString;
}

Je reçois toujours une erreur:

javax.net.ssl.SSLHandshakeException: Connexion fermée par l'homologue 01-24 10: 28: 03.182 32251-474/com.neosoft.meconnect W/System.err: à com.Android.org.conscrypt.NativeCrypto.SSL_do_handshake (Méthode native) 01-24 10: 28: 03.182 32251-474/com.neosoft.meconnect W/System.err:
à com.Android.org.conscrypt.OpenSSLSocketImpl.startHandshake (OpenSSLSocketImpl.Java:357) 01-24 10: 28: 03.182 32251-474/com.neosoft.meconnect W/System.err:
sur com.Android.okhttp.Connection.connectTls (Connection.Java:235) 01-24 10: 28: 03.182 32251-474/com.neosoft.meconnect W/System.err: à com.Android.okhttp.Connection.connectSocket (Connection.Java:199) 01-24 10: 28: 03.182 32251-474/com.neosoft.meconnect W/System.err: à com.Android.okhttp.Connection.connect (Connection.Java:172) 01-24 10: 28: 03.182 32251-474/com.neosoft.meconnect W/System.err: à com.Android.okhttp.Connection.connectAndSetOwner (Connection.Java:367) 01-24 10: 28: 03.182 32251-474/com.neosoft.meconnect W/System.err:
à com.Android.okhttp.OkHttpClient $ 1.connectAndSetOwner (OkHttpClient.Java:130) 01-24 10: 28: 03.182 32251-474/com.neosoft.meconnect W/System.err:
à com.Android.okhttp.internal.http.HttpEngine.connect (HttpEngine.Java:329) 01-24 10: 28: 03.182 32251-474/com.neosoft.meconnect W/System.err:
à com.Android.okhttp.internal.http.HttpEngine.sendRequest (HttpEngine.Java:246) 01-24 10: 28: 03.183 32251-474/com.neosoft.meconnect W/System.err:
à com.Android.okhttp.internal.huc.HttpURLConnectionImpl.execute (HttpURLConnectionImpl.Java:457) 01-24 10: 28: 03.183 32251-474/com.neosoft.meconnect W/System.err:
à com.Android.okhttp.internal.huc.HttpURLConnectionImpl.connect (HttpURLConnectionImpl.Java:126) 01-24 10: 28: 03.183 32251-474/com.neosoft.meconnect W/System.err:
à com.Android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect (DelegatingHttpsURLConnection.Java:89) 01-24 10: 28: 03.184 32251-474/com.neosoft.meconnect W/System.err:
à com.Android.okhttp.internal.huc.HttpsURLConnectionImpl.connect (HttpsURLConnectionImpl.Java) 01-24 10: 28: 03.184 32251-474/com.neosoft.meconnect W/System.err:
à org.ksoap2.transport.ServiceConnectionSE.connect (ServiceConnectionSE.Java:46) 01-24 10: 28: 03.184 32251-474/com.neosoft.meconnect W/System.err:
sur org.ksoap2.transport.HttpTransportSE.call (HttpTransportSE.Java:68) 01-24 10: 28: 03.184 32251-474/com.neosoft.meconnect W/System.err:
sur srd.gshelp.GSSoapConWSDL.javaHit (GSSoapConWSDL.Java:180) 01-24 10: 28: 03.184 32251-474/com.neosoft.meconnect W/System.err: à srd.gshelp.GSSoapConWSDL.access $ 0 (GSSoapConWSDL.Java:144) 01-24 10: 28: 03.185 32251-474/com.neosoft.meconnect W/System.err: à srd.gshelp.GSSoapConWSDL $ TaskAsync.doInBackground (GSSoapConWSDL.Java:215) 01-24 10: 28: 03.185 32251-474/com.neosoft.meconnect W/System.err:
à srd.gshelp.GSSoapConWSDL $ TaskAsync.doInBackground (GSSoapConWSDL.Java:1) 01-24 10: 28: 03.185 32251-474/com.neosoft.meconnect W/System.err:
sur Android.os.AsyncTask $ 2.call (AsyncTask.Java:304) 01-24 10: 28: 03.185 32251-474/com.neosoft.meconnect W/System.err: à Java.util.concurrent.FutureTask.run (FutureTask.Java:237) 01-24 10: 28: 03.186 32251-474/com.neosoft.meconnect W/System.err: à Java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.Java:1133) 01-24 10: 28: 03.186 32251-474/com.neosoft.meconnect W/System.err:
à Java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.Java:607) 01-24 10: 28: 03.186 32251-474/com.neosoft.meconnect W/System.err:
à Java.lang.Thread.run (Thread.Java:761) 01-24 10: 28: 03.187 32251-474/com.neosoft.meconnect W/System.err: Supprimé: javax.net.ssl.SSLHandshakeException: Connexion fermée par un homologue

S'il vous plaît, aidez-moi ... Merci d'avance.

12
Gulashan Faye

Assurez-vous que vous avez défini TLS activé du côté serveur.

3
Nayan

Avez-vous utilisé la bibliothèque Okhttp? C'est une très bonne bibliothèque pour les appels réseau. Vous pouvez gérer cette exception cela aussi.

J'ai eu le même problème et je l'ai réussi avec ceci: 

public static OkHttpClient getHttpClientForFile() {
        ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                .tlsVersions(TlsVersion.TLS_1_0)
                .cipherSuites(
                        CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
                        CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
                        CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
                        CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
                        CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA,
                        CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA)
                .build();
        return new OkHttpClient.Builder()
                .connectTimeout(2, TimeUnit.MINUTES)
                .writeTimeout(2, TimeUnit.MINUTES)
                .readTimeout(3, TimeUnit.MINUTES)
                .connectionSpecs(Collections.singletonList(spec))
                .protocols(Arrays.asList(Protocol.HTTP_1_1))
                .build();
    }

Je ne sais pas si c'est bon ou pas, mais ça marche pour moi.

La classe que vous avez utilisée SSLSocketFactory peut générer une erreur après la publication de l'application sur Play Store ou Play Store peut vous avertir de modifier votre code.

Vous pouvez trouver la bibliothèque Okhttp à partir de https://github.com/square/okhttp .

1
Lalit Jadav

J'ai été confronté au même problème, le même javax.net.ssl.SSLHandshakeException est lancé au moment de l'appel de l'API.

mais dans mon cas, ce qui suit était la question 

ma device était connected à la wifi mais le routeur wifi était not ayant la connexion internet et ensuite la exception a été lancée 

0
Sumit Jain