SSLHandshakeException с использованием HttpsURLConnection в Android

Подробности о моем приложении:

compileSdkVersion 22
    buildToolsVersion '22.0.1'



    defaultConfig {
        applicationId "My application id"
        minSdkVersion 13
        targetSdkVersion 22
        versionCode 4
        versionName "2"
    }

Я использую HttpsURLConnection для аутентификации при входе. Но теперь я сталкиваюсь с javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException, что также на устройствах, работающих под Android lollipop. Аутентификация работает как ожидается на устройствах с ОС версии выше 5. Пожалуйста, дайте мне знать ваши предложения по этой проблеме.

Вот код, который я использую:

    HttpsURLConnection conn = null;
    try {
        URL url = new URL("URL to my application");

        String authStr = username + ":" + password;

        String authEncoded = Base64.encodeToString(authStr.getBytes(), Base64.NO_WRAP);
        conn = (HttpsURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Authorization", "Basic " + authEncoded);
        conn.setDoOutput(true);

        conn.setConnectTimeout(120000);
        int code = conn.getResponseCode();

        if(code ==200){
            for(int i=0;i<conn.getHeaderFields().size();i++){
                String value = conn.getHeaderField(i);

                HeaderElement headerElement =  BasicHeaderValueParser.parseHeaderElement(value, new BasicHeaderValueParser());

                if(headerElement.getName().equals("SMSESSION")){

                    cookieString = SMSESSION+"="+headerElement.getValue();
                    Log.d("validhdvaluelogin",cookieString);
                    cookieeditor.putString(ArticleListActivity.CURRENT_COOKIE,
                            cookieString);
                    cookieeditor.apply();

                    return true;
                }


            }
        }else {
            return false;
        }



    }

    catch (Exception e) {
        e.printStackTrace();
        return false;
    }


    if (conn != null) {
        conn.disconnect();
    }

    return false;

И вот исключение:

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL       
handshake aborted: ssl=0xb87b0350: Failure in SSL library, usually a    
protocol error
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake            
failure (external/openssl/ssl/s23_clnt.c:741 0xa9092990:0x00000000)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:448)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.<init>(OpenSSLSocketImpl.java:661)
at com.android.org.conscrypt.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:632)
at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:70)
at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:172)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at com.ericsson.labs.it.infoservicemx.network.AuthComm.login(AuthComm.java:148)
at com.ericsson.labs.it.infoservicemx.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:312)
at com.ericsson.labs.it.infoservicemx.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:230)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xb87b0350: Failure in SSL library, usually a protocol error
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741 0xa9092990:0x00000000)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:405)
... 23 more

person SriMaharshi Manchem    schedule 14.04.2016    source источник
comment
Я думаю, что связанные с ним вопросы stackoverflow.com/a/27928360/3436179   -  person Alexander    schedule 14.04.2016
comment
Решение, представленное в этом посте, у меня не сработало   -  person SriMaharshi Manchem    schedule 15.04.2016


Ответы (1)


Наконец-то я нашел решение своей проблемы. Используя библиотеку NetCipher для httpsurlconnection. Вместо использования:

HttpsUrlConnection conn = (HttpsURLConnection) url.openConnection();

Использовать:

HttpsUrlConnection conn =  NetCipher.getHttpsURLConnection(url);

Это решило мою проблему рукопожатия SSLv3.

person SriMaharshi Manchem    schedule 15.04.2016
comment
Здесь вопрос в том, как решить проблему SSL с помощью HttpUrlConnection, а не в том, какую библиотеку мы должны использовать !!! - person Jayesh L; 02.03.2020
comment
получить сертификат сервера и добавить в доверенный сертификат в вашем httpconnection - person SriMaharshi Manchem; 15.05.2021