Ich rufe https webservice an, und es funktioniert gut, aber jetzt, wenn ich versuche, es zu nennen, geben Sie mir folgende Fehler.
Protokollfehler:
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)
Ich benutze folgenden Code zum Aufrufen von https Webservice.
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();
}
}
Es funktioniert gut, aber jetzt scheitert es. Es werden keine Änderungen am Server vorgenommen.
Ich habe schon erwähnt
Ich habe es sowohl in WLAN als auch in mobilen Daten getestet. Anwendung funktioniert nicht in beiden.
Falls jemand vor diesem Problem steht, helfen Sie mir bitte, es zu lösen.
Ich habe auch die gleiche Ausnahme. Ich fand heraus, dass es aufgrund des Protokolls TLS 1.0 vom Server nicht unterstützt wurde.
Ich habe festgestellt, dass die Android-Verbindung mit der http-Verbindung zum Server fehlschlägt, auf dem TLS 1.0
nicht unterstützt wird. Ich suchte überall nach dem Fehler, fand aber nichts im Zusammenhang mit diesem Problem. Das Problem wurde behoben, als die TLS 1.0 protocol
-Unterstützung zum Server hinzugefügt wurde. Sie können die Unterstützung des Server-/Hostnamenprotokolls mit https://www.ssllabs.com/ssltest überprüfen.
Es kann zwei Gründe geben:
Zertifikate können auf Client- oder Server-Seite abgelaufen sein.
Lösung: Verfallsdatum des vorhandenen Zertifikats verlängern oder neue Zertifikate austauschen.
Der Serverport wurde auf einen anderen Port zurückgesetzt.
Lösung: Dieses Portänderungsproblem ist normalerweise auf Grund von Serverwartung oder Patch-Update aufgetreten. Manchmal wird der Port des Dienstes geändert. Bitten Sie die Person, die Ihnen das WSDL zur Verfügung gestellt hat, um WSDL auf ihrem Server neu zu generieren, und prüfen Sie, ob der Port mit dem vorhandenen WSDL auf Clientseite übereinstimmt oder nicht. Am wahrscheinlichsten wäre dies hier der Fall.
Wir hatten das gleiche Problem heute Morgen und haben es gelöst.
SSL an IIS 8
Ich hatte das gleiche Problem mit einigen Android-Geräten. Die Lösung wurde durch IIS Servereinstellungen gefunden.
Schritte:
Referenz-Screenshot:
Hoffe das würde dir helfen.