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é
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.
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 .
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.
Nous avons eu le même problème à partir de ce matin et l’avons résolu.
SSL sur IIS 8
J'avais le même problème pour certains appareils Android. Trouvé la solution par IIS paramètres du serveur} _.
Pas:
Reference screenshot:
J'espère que cela vous aidera.