我有一个对HTTPS后端进行REST调用的项目,它在一些设备上运行良好,而在另一些设备上中断。
这是我得到的错误:
com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL握手中止: ssl=0x78004ee8: ssl=0x78004ee8库中的失败,通常是协议错误:140770FCSL routinesSL23_GET_SERVER_HELLO:unknown协议(外部/openssl/ SSL /s23_clnt.c:766 0x731f5d5c:0x00000000)
看了看Volley文档,他们提到
“您可以包含您自己的HTTPStack (以处理SSL连接.”
有人这么做是为了截击吗?如果是这样,请您分享您的更改吗?
注:证书由一个有效实体签名,该实体已在设备的受信任证书中。
发布于 2015-01-31 17:50:36
这是我的解决方案:
在类中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;
}我知道这是不安全的,但我使用它只是为了测试目的。您可以通过只接受来自服务器的证书来提高安全性。
https://stackoverflow.com/questions/22564317
复制相似问题