javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL ръкостискането е прекъснато

От известно време търся решение на този проблем, но просто не мога да го разбера

Опитвам се да използвам ssl през http връзка между приложение за Android и сървъра, създадох хранилище за ключове с моя самоподписан сертификат

имам този код:

    URL url;
    SSLContext sslContext = null;
    KeyStore keyStore = KeyStore.getInstance("BKS");    
    InputStream input = SportsApplication.getContext().getResources().openRawResource(R.raw.mykeystore);
    keyStore.load(input, "mypass".toCharArray());
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
    kmf.init(keyStore, "mypass".toCharArray());
    KeyManager[] keyManagers = kmf.getKeyManagers();
    sslContext = SSLContext.getInstance("TLS");
    sslContext.init(keyManagers, null, null);

    HttpsURLConnection connection = null;
    String urlParameters = mJObject.toString();
    try {
        Log.w("client", mUrl);
        Log.v("client", "request: "+urlParameters);
        // Create connection
        mUrl = mUrl.replaceFirst("http", "https");
        url = new URL(mUrl);
        connection = (HttpsURLConnection) url.openConnection();
        try{

            connection.setSSLSocketFactory(sslContext.getSocketFactory());
        }
        catch (Exception e1) {
            e1.printStackTrace();
            int tx =0;
        }
        try{
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-type", "application/json");
        connection.setRequestProperty("Accept", "application/json");
        connection.setReadTimeout(dataTimeout);
        connection.setConnectTimeout(com.inmobly.buckeyes.client.Constants.DEFAULT_CONN_TIMEOUT);

        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);
        }
        catch (Exception e1) {
            e1.printStackTrace();
            int tx =0;
        }
        // Send request
        DataOutputStream wr = null;
        try{
         wr = new DataOutputStream(connection.getOutputStream());
        }
        catch (Exception e1) {
            e1.printStackTrace();
            int tx =0;
        }

но продължавам да получавам това изключение:

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x1b1b0e0: Failure in SSL library, usually a protocol errorerror:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x4029bcf5:0x00000000)

какво правя грешно


person Yasmin Reda    schedule 16.09.2013    source източник
comment
Имам същия проблем. Намерихте ли отговор @Yasmin Reda?   -  person Mike_NotGuilty    schedule 24.12.2014


Отговори (2)


тъй като самото ръкостискане на SSL не преминава, вместо да го отстранявате, като използвате информацията в изключението, можете ли да инсталирате wireshark на вашата система (това е възпроизводимо и на симулатора) и да погледнете улавянето на пакети на ниво OS. Ако грешката се дължи на несъответствие на версията на протокола между реализациите на ssl на сървъра и клиента, пакетите трябва да имат необходимата информация. Можете първо да опитате просто ssl ръкостискане, за да сте сигурни, че ръкостискането се случва правилно със сървъра. Уведомете ни каква информация получавате и ние ще отстраняваме грешки по-нататък!

person Rajarajan Pudupatti Sundari Je    schedule 12.11.2013
comment
винаги се радвам да видя такива коментари :) продължавай да се движиш. - person Rajarajan Pudupatti Sundari Je; 08.07.2015
comment
@Bhavit Може ли да споделиш какъв бъг беше това. Имах същия проблем на по-ниска версия на android. Внедрено в NoSSlFactory от SO. Но все още не работи. - person Vindhya Pratap Singh; 27.06.2017
comment
@VindhyaPratapSingh Написах отговор за този бъг тук: stackoverflow.com/questions/29916962/ - person Bhavit S. Sengar; 28.06.2017
comment
Благодаря @Bhavita, проблемът ми беше коригиран чрез промяна на SSL протоколите от страната на сървъра. Моето устройство имаше API ниво 15, както е описано в документите, то може да поддържа само TLSv1. Този протокол беше деактивиран на сървърния SSL сертификат. Така че след като го активирате. Работи добре. - person Vindhya Pratap Singh; 28.06.2017

Вижте моя отговор на Как да деактивирате SSLv3 в HttpsUrlConnection в Android

person Bhavit S. Sengar    schedule 29.04.2015