2017-02-04 19 views
0

Привет У меня очень неприятная проблема с asynchttpclient в android. когда я пытаюсь отправить запрос на сервер я получаю эту ошибку:android asynchttpclient javax.net.ssl.SSLHandshakeException: Handshake failed

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) 

или

AsyncHttpClient client = new AsyncHttpClient(); 

ответ

0

По SSLLabs сайт работает только с клиентами, поддерживая SNI. Но согласно this bug report AsyncHttpClient не поддерживает SNI. Таким образом, вы получаете отказ от рукопожатия.

+0

Итак, что мне делать? Использовать другой httpclient? –

+0

@ mathias.h: Если вам нужен доступ к немодифицированному сайту, вам, вероятно, понадобится использовать другой HTTP-клиент, который поддерживает SNI. Если вы можете изменить конфигурацию сайта, вы можете изменить его, чтобы не требовать SNI. –

0

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