Android HttpsUrlConnection javax.net.ssl.SSLException Соединение закрыто из-за ошибки рукопожатия при использовании локального склада доверенных сертификатов

У меня проблемы с подключением Android к простомуOpenSSL сервер, использующийHttpsUrlConnection объект (я пролистал StackOverflow и кучу онлайн-уроков и следовал за примерами в значительной степени строка за строкой, и я до сих пор не могу понять, почему мой сломался, когда я использую свое локальное хранилище доверенных сертификатов).

В настоящее время у меня есть активность Android, которая пытается подключиться к простомуOpenSSL server (Я могу подключиться к своему серверу с помощью клиента OpenSSL), как толькоHttpsUrlConnection.connect() называется, я получаю & quot;javax.net.ssl.SSLException: Connection closed by peer" error during the SSL handshake.  Возможно, я неправильно настраиваю свой пример сервера?

Что следует отметить:

no client authorization at the moment am able to connect to https://www.google.com when loading default trust store am not able to connect to server on localhost with self-signed certificate do not want to trust all certificates do not want to use Apache HttpClient want to use local truststore only created local truststore with bouncy castle am able to correctly load truststore into behind a proxy firewall, proxy is set on my android virtual device AVD set to Android 4.1 API 16.

Вещи, которые я уже пробовал:

connecting to both 127.0.0.1 and 10.0.2.2 using a new SecureRandom() with the SSLContext.init() creating the URL with 'URL u = new URL("https", "10.0.2.2", 443, "/");' using TrustManagerFactory.getDefaultAlgorithms() instead of the "X509" gives "Unexpected response code error 503" instead of "Connection closed by peer"

Заранее спасибо, что нашли время, чтобы рассмотреть мой вопрос!

Простой сервер запущен командой:

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

Клиентское соединение проверяется командой:

$ openssl s_client -connect 127.0.0.1:443 

Код активности Android (отредактирован для удаления всего запущенного кода для упрощения - пожалуйста, дайте мне знать, если потребуется больше кода) - вывод ошибок ниже кода.

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

Выход при правильном подключении кhttps://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

Вывод при попытке подключиться к моему серверу с самозаверяющим сертификатом:

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)

Еще раз спасибо!!

Ответы на вопрос(2)

Ваш ответ на вопрос