Android HttpsUrlConnection javax.net.ssl.SSLException Połączenie zamknięte przez błąd uzgadniania równorzędnego podczas korzystania z lokalnego magazynu zaufanych certyfikatów

Mam problem z połączeniem Androida z prostymOpenSSL serwer za pomocąHttpsUrlConnection obiekt (przeczesałem StackOverflow i kilka samouczków online i podążyłem za przykładami w linii dla linii i nadal nie mogę zrozumieć, dlaczego mój jest uszkodzony, gdy używam mojego lokalnego magazynu zaufanych certyfikatów).

Obecnie mam działanie systemu Android, które próbuje połączyć się z prostymOpenSSL server (Mogę połączyć się z moim serwerem za pomocą klienta OpenSSL), razHttpsUrlConnection.connect() nazywa się Otrzymuję „javax.net.ssl.SSLException: Connection closed by peer" error during the SSL handshake. Być może nieprawidłowo konfiguruję serwer przykładowy?

Rzeczy do odnotowania:

obecnie brak autoryzacji klientajestem w stanie się połączyćhttps://www.google.com podczas ładowania domyślnego magazynu zaufanianie mogę połączyć się z serwerem na localhost z certyfikatem z podpisem własnymnie chcesz ufać wszystkim certyfikatomnie chcesz używać Apache HttpClientchcesz używać tylko lokalnego magazynu zaufanych certyfikatówstworzył lokalny magazyn zaufania z nadmuchiwanym zamkiemmogę poprawnie załadować magazyn zaufanych certyfikatówza firewallem proxy, proxy jest ustawione na moim wirtualnym urządzeniu z AndroidemAVD ustawiony naAndroid 4.1 API 16.

Rzeczy, które już próbowałem:

połączenie z obiema127.0.0.1 and 10.0.2.2używając nowegoSecureRandom() with the SSLContext.init()tworzenie adresu URL za pomocą'URL u = new URL("https", "10.0.2.2", 443, "/");'za pomocąTrustManagerFactory.getDefaultAlgorithms() zamiast „X509”daje"Unexpected response code error 503" zamiast „Połączenie zamknięte przez równorzędnego”

Z góry dziękuję za poświęcenie czasu na przejrzenie mojego pytania!

Prosty serwer uruchomiono poleceniem:

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

Testowane połączenie klienta za pomocą polecenia:

$ openssl s_client -connect 127.0.0.1:443 

Kod aktywności Androida (edytowany, aby usunąć cały działający kod w celu uproszczenia - daj mi znać, jeśli potrzebujesz więcej kodu) - wyjście błędu jest poniżej kodu.

    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;
    }

Wyjście po prawidłowym połączeniu zhttps://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

Wyjście podczas próby połączenia się z moim serwerem za pomocą samopodpisanego certyfikatu:

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)

Dzięki jeszcze raz!!