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.
Assurez-vous que vous avez défini TLS activé du côté serveur.
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 .
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