15

before api level 24 my code is working fine but it is giving me error on api level 24( 7.0 Nougat). I am not getting what's going wrong with my code.

First Approach is here :

 <?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>

Inside manifest file :

android:network Security Config = "@xml/network_security_config" I have included network_security_config inside res/xml/network_security_config and ca certificate is inside res/raw/my_ca.pem

Second Approach is here :

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

While making http connection :

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

Still I am getting error:

javax.net.ssl.SSLHandshakeException: Connection closed by peer 01-24 10:28:03.182 32251-474/com.neosoft.meconnect W/System.err: at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) 01-24 10:28:03.182 32251-474/com.neosoft.meconnect W/System.err:
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357) 01-24 10:28:03.182 32251-474/com.neosoft.meconnect W/System.err:
at com.android.okhttp.Connection.connectTls(Connection.java:235) 01-24 10:28:03.182 32251-474/com.neosoft.meconnect W/System.err: at com.android.okhttp.Connection.connectSocket(Connection.java:199) 01-24 10:28:03.182 32251-474/com.neosoft.meconnect W/System.err: at com.android.okhttp.Connection.connect(Connection.java:172) 01-24 10:28:03.182 32251-474/com.neosoft.meconnect W/System.err: at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367) 01-24 10:28:03.182 32251-474/com.neosoft.meconnect W/System.err:
at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:130) 01-24 10:28:03.182 32251-474/com.neosoft.meconnect W/System.err:
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329) 01-24 10:28:03.182 32251-474/com.neosoft.meconnect W/System.err:
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246) 01-24 10:28:03.183 32251-474/com.neosoft.meconnect W/System.err:
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457) 01-24 10:28:03.183 32251-474/com.neosoft.meconnect W/System.err:
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126) 01-24 10:28:03.183 32251-474/com.neosoft.meconnect W/System.err:
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89) 01-24 10:28:03.184 32251-474/com.neosoft.meconnect W/System.err:
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java) 01-24 10:28:03.184 32251-474/com.neosoft.meconnect W/System.err:
at org.ksoap2.transport.ServiceConnectionSE.connect(ServiceConnectionSE.java:46) 01-24 10:28:03.184 32251-474/com.neosoft.meconnect W/System.err:
at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:68) 01-24 10:28:03.184 32251-474/com.neosoft.meconnect W/System.err:
at srd.gshelp.GSSoapConWSDL.javaHit(GSSoapConWSDL.java:180) 01-24 10:28:03.184 32251-474/com.neosoft.meconnect W/System.err: at srd.gshelp.GSSoapConWSDL.access$0(GSSoapConWSDL.java:144) 01-24 10:28:03.185 32251-474/com.neosoft.meconnect W/System.err: at srd.gshelp.GSSoapConWSDL$TaskAsync.doInBackground(GSSoapConWSDL.java:215) 01-24 10:28:03.185 32251-474/com.neosoft.meconnect W/System.err:
at srd.gshelp.GSSoapConWSDL$TaskAsync.doInBackground(GSSoapConWSDL.java:1) 01-24 10:28:03.185 32251-474/com.neosoft.meconnect W/System.err:
at android.os.AsyncTask$2.call(AsyncTask.java:304) 01-24 10:28:03.185 32251-474/com.neosoft.meconnect W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237) 01-24 10:28:03.186 32251-474/com.neosoft.meconnect W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 01-24 10:28:03.186 32251-474/com.neosoft.meconnect W/System.err:
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 01-24 10:28:03.186 32251-474/com.neosoft.meconnect W/System.err:
at java.lang.Thread.run(Thread.java:761) 01-24 10:28:03.187 32251-474/com.neosoft.meconnect W/System.err: Suppressed: javax.net.ssl.SSLHandshakeException: Connection closed by peer

Kindly help. Thanks in Advance.

D.J
  • 1,258
  • 10
  • 22
Gulashan Faye
  • 194
  • 1
  • 1
  • 7

3 Answers3

5

Make sure that you have set TLS enabled from the server side.

Nayan
  • 287
  • 3
  • 18
  • Both server and client protocols are same. then also i am facing this issue. This is my code. pls help https://stackoverflow.com/questions/49946350/okhttp-android-websocket-and-jetty-server-connection-with-ssl/ – Firnaz Apr 27 '18 at 11:53
1

Do you have used Okhttp library ? It is very good library for network calls. You can handle this exception it that also.

I had similar issue and i have managed it with this :

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

I don't know whether it is good or not, but it is working for me.

The class you have used SSLSocketFactory may produce error after publishing app on play store or play store may give you warning to change your code.

You can find Okhttp library from https://github.com/square/okhttp.

Lalit Jadav
  • 1,340
  • 14
  • 37
1

I have faced the same issue, same javax.net.ssl.SSLHandshakeException is throwing at the time of API call.

but in my case, the following was the issue

my device was connected to the wifi but wifi router was not having the internet connection and then the exception was thrown

Sumit Jain
  • 760
  • 1
  • 12
  • 18
  • It is not good to downvote without any reason and please try once the scenario I have posted and if it is now thrown the `javax.net.ssl.SSLHandshakeException` then downvote – Sumit Jain Aug 05 '19 at 03:51