java - example - tls android




javax.net.ssl.SSLException: SSL-Handshake abgebrochen. Verbindung beim Peer-Aufruf von Webservice Android durch Peer zurückgesetzt (3)

Ich rufe https webservice an und es funktioniert gut vorher, aber jetzt, wenn ich versuche, es zu nennen gibt es mir folgende Fehler.

Fehler protokollieren:

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 verwende folgenden Code zum Aufruf 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 vorher, aber jetzt schlägt es fehl. Es wurden keine Änderungen am Server vorgenommen.

Ich habe bereits referiert

  1. Android-Abfrage - Zufällige SSLE-Ausnahmen
  2. Intermittierende Verbindung Zurücksetzen durch Peer-Fehler bei der Verbindung von Android mit dem .NET-REST-Endpunkt
  3. Android HTTPS-Ausnahme Verbindung durch Peer zurückgesetzt
  4. Warum wirft HttpUrlConnection während einer mobilen Datenverbindung eine SSLException?

Ich habe es sowohl in WLAN als auch in mobilen Daten getestet. Anwendung funktioniert nicht in beiden.

Wenn jemand mit diesem Problem konfrontiert wird, dann hilf mir bitte, es zu lösen.


Es könnte zwei Gründe geben:

Zertifikate können auf Client- oder Server-Seite abgelaufen sein.

Lösung: Verlängern Sie das Ablaufdatum des vorhandenen Zertifikats oder Exhange neue Zertifikate.

Der Server-Port wurde auf einen anderen Port zurückgesetzt.

Lösung: Ich habe dieses Hafenänderungsproblem, normalerweise wegen der Wartung des Servers oder des Patchupdates, manchmal erfahren, das Hafen des Services Änderung erhalten. Bitten Sie die Person, die Ihnen die WSDL zur Verfügung gestellt hat, wsdl auf ihrem Server neu zu generieren, und prüfen Sie den Port no, ob er mit der vorhandenen WSDL auf der Clientseite übereinstimmt oder nicht. Wahrscheinlich wäre dies hier der Fall.


Ich habe auch die selbe Ausnahme. Ich habe festgestellt, dass es aufgrund des TLS 1.0-Protokolls vom Server nicht unterstützt wurde.

Ich habe festgestellt, dass Android-Gerät, http-Verbindung fehlschlägt zu dem Server, auf dem TLS 1.0 nicht unterstützt wird. Ich habe überall nach dem Bug gesucht, aber nichts mit diesem Problem gefunden. Das Problem wurde gelöst, als die TLS 1.0 protocol zum Server hinzugefügt wurde. Sie können die Server / Hostname-Protokollunterstützung unter https://www.ssllabs.com/ssltest überprüfen.


Wir hatten dieses Problem heute morgen und haben es gelöst.

SSL auf IIS 8

  1. Alles hat gestern gut funktioniert und letzte Nacht wurde unser SSL auf der IIS Seite aktualisiert.
  2. Beim Auschecken der Website-Bindungen an SSL haben wir festgestellt, dass IIS8 ein neues Kontrollkästchen "Server Name Indication" (Server-Namensanzeige erforderlich) enthält. Es wurde nicht aktiviert, daher wurde es aktiviert.
  3. Das hat das Problem ausgelöst.
  4. Ging zurück zu IIS, deaktiviert das Kontrollkästchen .... Problem gelöst!




https