android asynchttpclient javax.net.ssl.SSLHandshakeException: рукопожатие не удалось

Привет, у меня очень неприятная проблема с asynchttpclient в Android. когда я пытаюсь отправить запрос на сервер, я получаю эту ошибку:

onFailure:: javax.net.ssl.SSLHandshakeException: Handshake failed

Я попробовал почтальон и браузер, и он работает без проблем, и я получаю ответ, но в приложении он не работает.

У сервера есть действительный сертификат ssl, я даже пытался отключить проверку проверки ssl, но все равно получаю эту глупую ошибку.

myapikey — это код, которым я не могу с вами делиться.

MainActivity.java:

if (getSharedPreferences("guest_token", MODE_PRIVATE).getString("gtkn",null) == null){
        AsyncHttpClient client = new AsyncHttpClient(true,80,443);
        client.addHeader("Authorization", "myapikey");

        client.setSSLSocketFactory(
                new SSLSocketFactory(getSslContext(),
                        SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER));

        client.get("https://dev.sarshomar.com/api/v1/token/guest", new TextHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers, String responseString) {
                try {
                    JSONObject m_obj = new JSONObject(responseString);
                    String guest_token = m_obj.getJSONObject("msg").getJSONObject("callback").getString("token");

                    SharedPreferences pref = getSharedPreferences("guest_token", MODE_PRIVATE);
                    SharedPreferences.Editor editor = pref.edit();
                    editor.putString("gtkn", guest_token);
                    editor.apply();

                    Log.d("onSuccess_token: ", guest_token);
                    Toast.makeText(getApplicationContext(),guest_token,Toast.LENGTH_LONG).show();

                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_LONG).show();

                }

            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String errorresponse, Throwable throwable) {
                throwable.printStackTrace();
                Log.d("onFailure: ",throwable.toString()+errorresponse+statusCode+throwable.getLocalizedMessage());
            }

            @Override
            public void onStart() {
                // called before request is started
            }


            @Override
            public void onRetry(int retryNo) {
                // called when request is retried
            }
        });
    }
}

public SSLContext getSslContext() {

    TrustManager[] byPassTrustManagers = new TrustManager[] { new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }

        public void checkClientTrusted(X509Certificate[] chain, String authType) {
        }

        public void checkServerTrusted(X509Certificate[] chain, String authType) {
        }
    } };

    SSLContext sslContext=null;

    try {
        sslContext = SSLContext.getInstance("TLS");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    try {
        sslContext.init(null, byPassTrustManagers, new SecureRandom());
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }

    return sslContext;
}

Я получаю сообщение об ошибке независимо от того, пытаюсь ли я

AsyncHttpClient client = new AsyncHttpClient(true,80,443)

or

AsyncHttpClient client = new AsyncHttpClient();

person Hosein Hamzenejad    schedule 04.02.2017    source источник


Ответы (2)


Согласно SSLLabs сайт работает только с клиентами, поддерживающими SNI. Но, согласно этому отчету об ошибке, AsyncHttpClient не поддерживает SNI. Таким образом, вы получаете отказ рукопожатия.

person Steffen Ullrich    schedule 04.02.2017
comment
И что же мне делать? Использовать другой httpclient? - person Hosein Hamzenejad; 04.02.2017
comment
@mathias.h: Если вам нужно получить доступ к немодифицированному сайту, вам, вероятно, потребуется использовать другой HTTP-клиент, поддерживающий SNI. Если вы можете изменить конфигурацию сайта, вы можете изменить ее, чтобы не требовать SNI. - person Steffen Ullrich; 04.02.2017

ОК, я начал использовать Volley вместо AsyncHttpclient loopj, и он работает как шарм, поэтому, если у кого-то еще есть такая же проблема, как у меня, вместо этого используйте залп, его довольно легко изучить и использовать.

person Hosein Hamzenejad    schedule 04.02.2017