Android HttpsUrlConnection javax.net.ssl.SSLException Die Verbindung wurde bei Verwendung des lokalen Truststores durch einen Peer-Handshake-Fehler geschlossen

Ich habe Probleme damit, Android dazu zu bringen, eine einfache Verbindung herzustellenOpenSSL Server mit derHttpsUrlConnection object (Ich habe StackOverflow und eine Reihe von Online-Tutorials durchgearbeitet und bin den Beispielen Zeile für Zeile gefolgt, und ich kann immer noch nicht herausfinden, warum meine fehlerhaft sind, wenn ich meinen lokalen Truststore verwende.)

Ich habe derzeit eine Android-Aktivität, die versucht, eine einfache Verbindung herzustellenOpenSSL server (Ich kann über einen OpenSSL-Client eine Verbindung zu meinem Server herstellen.)HttpsUrlConnection.connect() heißt ich erhalte ein "javax.net.ssl.SSLException: Connection closed by peer" error during the SSL handshake. Vielleicht richte ich meinen Beispielserver falsch ein?

Dinge zu beachten:

Keine Kundenautorisierung im Momentbin in der Lage zu verbindenhttps://www.google.com beim Laden des Standard-Truststoreskann keine Verbindung zum Server auf localhost mit selbstsigniertem Zertifikat herstellenIch möchte nicht allen Zertifikaten vertrauenIch möchte Apache HttpClient nicht verwendenmöchte nur den lokalen Truststore verwendenlokalen Truststore mit Hüpfburg erstelltkann den Truststore korrekt ladenHinter einer Proxy-Firewall befindet sich ein Proxy auf meinem virtuellen Android-GerätAVD auf eingestelltAndroid 4.1 API 16.

Dinge, die ich bereits ausprobiert habe:

Verbindung zu beiden127.0.0.1 and 10.0.2.2mit einem neuenSecureRandom() with the SSLContext.init()Erstellen Sie die URL mit'URL u = new URL("https", "10.0.2.2", 443, "/");'mitTrustManagerFactory.getDefaultAlgorithms() anstelle des "X509"gibt"Unexpected response code error 503" anstelle von "Verbindung von Peer geschlossen"

Vielen Dank im Voraus, dass Sie sich die Zeit genommen haben, meine Frage zu überprüfen!

Einfacher Server gestartet mit Befehl:

$ sudo openssl s_server -accept 443 -cert server-cert.pem -key server-key.pem -pass file:passphrase.txt -state -www -verify 0

Clientverbindung getestet mit Befehl:

$ openssl s_client -connect 127.0.0.1:443 

Android-Aktivitätscode (zur Vereinfachung zum Entfernen des vollständigen laufenden Codes bearbeitet - bitte teilen Sie mir mit, ob weiterer Code benötigt wird) - Die Fehlerausgabe befindet sich unterhalb des Codes.

    try {
        TrustManagerFactory tmf;

        // local trust store
        tmf = TrustManagerFactory.getInstance("X509");
        tmf.init(loadLocalKeyStore(getApplicationContext()));

        // default trust store - works for https://www.google.com
        // tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        // tmf.init((KeyStore) null);

        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);

        HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.STRICT_HOSTNAME_VERIFIER;
        URL u = new URL("https://10.0.2.2");

        HttpsURLConnection urlConnection = (HttpsURLConnection) u.openConnection();

        urlConnection.setSSLSocketFactory(context.getSocketFactory());
        urlConnection.setHostnameVerifier(hostnameVerifier);
        urlConnection.connect();

        System.out.println("Response Code: " + urlConnection.getResponseCode());
        System.out.println("Response Code: " + urlConnection.getCipherSuite());
    } 

    ...

    private KeyStore loadLocalKeyStore(Context context) {
        InputStream in = context.getResources().openRawResource(R.raw.newserverkeystore);
        KeyStore trusted = null;
        try {
           trusted = KeyStore.getInstance("BKS");
           trusted.load(in, "thisisasecret".toCharArray());
        } finally {
           in.close();
        }
       return trusted;
    }

Ausgabe bei korrektem Anschluss anhttps://www.google.com:

09-09 21:58:09.947: I/System.out(669): Response Code: 200
09-09 21:58:09.947: I/System.out(669): Response Code: TLS_ECDHE_RSA_WITH_RC4_128_SHA

Ausgabe beim Versuch, mit einem selbstsignierten Zertifikat eine Verbindung zu meinem Server herzustellen:

09-09 22:03:23.377: D/HttpsProxy(717): Https Request error
09-09 22:03:23.377: D/HttpsProxy(717): javax.net.ssl.SSLException: Connection closed by peer
09-09 22:03:23.377: D/HttpsProxy(717):  at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
09-09 22:03:23.377: D/HttpsProxy(717):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:395)
09-09 22:03:23.377: D/HttpsProxy(717):  at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210)
09-09 22:03:23.377: D/HttpsProxy(717):  at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)
09-09 22:03:23.377: D/HttpsProxy(717):  at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:442)
09-09 22:03:23.377: D/HttpsProxy(717):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
09-09 22:03:23.377: D/HttpsProxy(717):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
09-09 22:03:23.377: D/HttpsProxy(717):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
09-09 22:03:23.377: D/HttpsProxy(717):  at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:165)
09-09 22:03:23.377: D/HttpsProxy(717):  at com.example.myfirstapp.HttpsUrlConnectionActivity$3.doInBackground(HttpsUrlConnectionActivity.java:257)
09-09 22:03:23.377: D/HttpsProxy(717):  at com.example.myfirstapp.HttpsUrlConnectionActivity$3.doInBackground(HttpsUrlConnectionActivity.java:1)
09-09 22:03:23.377: D/HttpsProxy(717):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
09-09 22:03:23.377: D/HttpsProxy(717):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-09 22:03:23.377: D/HttpsProxy(717):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-09 22:03:23.377: D/HttpsProxy(717):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-09 22:03:23.377: D/HttpsProxy(717):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-09 22:03:23.377: D/HttpsProxy(717):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-09 22:03:23.377: D/HttpsProxy(717):  at java.lang.Thread.run(Thread.java:856)

Danke noch einmal!!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage