【问题标题】:android asynchttpclient javax.net.ssl.SSLHandshakeException: Handshake failedandroid asynchttpclient javax.net.ssl.SSLHandshakeException:握手失败
【发布时间】:2017-06-21 16:09:50
【问题描述】:

您好,我在 android 中遇到了一个非常烦人的 asynchttpclient 问题。当我尝试向服务器发送请求时出现此错误:

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();

【问题讨论】:

    标签: java android ssl sslhandshakeexception asynchttpclient


    【解决方案1】:

    根据SSLLabs,该站点仅适用于支持SNI 的客户端。但是根据this bug report AsyncHttpClient 不支持SNI。因此,您会遇到握手失败。

    【讨论】:

    • 那我该怎么办?使用另一个 httpclient?
    • @mathias.h:如果您需要访问未修改的站点,您可能需要使用另一个支持 SNI 的 HTTP 客户端。如果您能够更改站点的配置,则可以将其更改为不需要 SNI。
    【解决方案2】:

    好的,我开始使用 Volley 而不是 loopj 的 AsyncHttpclient,它的工作原理就像一个魅力,所以如果其他人有与我相同的问题,使用 volley 来代替它很容易学习和使用。

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 1970-01-01
      • 2017-08-16
      • 2017-09-09
      • 2015-08-15
      • 2017-12-30
      • 2020-04-25
      • 2016-01-18
      • 2016-01-05
      相关资源
      最近更新 更多