对Volley Android网络库的HTTPS支持

时间:2014-03-21 16:32:15

标签: android http rest https android-volley

我有一个项目对HTTPS后端进行REST调用 它在某些设备上工作正常,并在其他设备上打破。

这是我得到的错误:

  

com.android.volley.NoConnectionError:   javax.net.ssl.SSLHandshakeException:   javax.net.ssl.SSLProtocolException:SSL握手已中止:   ssl = 0x78004ee8:SSL库失败,通常是协议错误   错误:140770FCSL例程SL23_GET_SERVER_HELLO:未知协议   (external / openssl / ssl / s23_clnt.c:766 0x731f5d5c:0x00000000)

看看Volley文档,他们提到了

  

“您可以包含自己的HTTPStack(以处理SSL连接[...])”

有人为凌空做过这件事吗?如果是这样,请分享您的更改?

注意:证书由已存在于设备的可信证书中的有效实体签名。

1 个答案:

答案 0 :(得分:6)

这是我的解决方案:

在方法<{p>中的课程Volley

public static RequestQueue newRequestQueue(Context context, HttpStack stack)

找到以下文字:

stack = new HurlStack();

然后将此行更改为:

stack = new HurlStack(null, createSslSocketFactory());

其中方法createSslSocketFactory()定义如下:

private static SSLSocketFactory createSslSocketFactory() {
    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;
    SSLSocketFactory sslSocketFactory = null;
    try {
        sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, byPassTrustManagers, new SecureRandom());
        sslSocketFactory = sslContext.getSocketFactory();

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        Log.e(TAG, StringUtils.EMPTY, e);
    } catch (KeyManagementException e) {
        Log.e(TAG, StringUtils.EMPTY, e);
    }

    return sslSocketFactory;
}

我知道这不安全,但我仅将其用于测试目的。您可以通过仅接受来自服务器的证书来提高安全性。