android - 使用 Volley 时出现 SSL 异常

标签 android android-volley sslexception

我在 Android 中使用 Volley 来执行我的应用程序请求。不幸的是,我收到以下错误:

com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x61e15f78: Failure in SSL library, usually a protocol error
    error:1407743E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert inappropriate fallback (external/openssl/ssl/s23_clnt.c:744 0x5b647c58:0x00000000)

我在 ViewPager 中使用了两个 Fragments,它们在 onResume 期间请求它们的内容。请求 url 基本相同,但用于查询参数(设置内容类型,例如趋势与热门)。

URL 的格式为 https://host/api/content?type={hot/trending}。授权通过请求 header 完成。

关于此异常的奇怪之处在于,两个请求中只有一个失败,并且不时地改变哪个请求。在我在它们之间添加延迟后,异常停止发生(奇怪地指向某些竞争条件?)。但这似乎是一个糟糕的解决方法,我想以正确的方式解决这个问题。

有什么想法可能是它的原因吗?

编辑:

请求以标准方式创建,使用提供队列的单例,如下所示:

final RequestQueue requestQueue = RequestQueueSingleton.getInstance(getActivity()).getRequestQueue();
final GsonRequestGet<SearchApiWrapper> gsonRequest = new GsonRequestGet<>(clazz, url,successListener, errorListener);
gsonRequest.setRetryPolicy(new DefaultRetryPolicy(3000, 3, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
gsonRequest.setTag(mTag);
requestQueue.add(gsonRequest);

这是单例类:

public class RequestQueueSingleton {

    private static RequestQueueSingleton mInstance;
    private RequestQueue mRequestQueue;
    private Context mContext;

    public RequestQueueSingleton(Context context) {
        mContext = context;
        mRequestQueue = getRequestQueue();
    }

    /**
     * Returns a instance of this singleton
     */
    public static synchronized RequestQueueSingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new RequestQueueSingleton(context);
        }
        return mInstance;
    }

    /**
     * Returns instance of the request queue
     */
    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());
        }
        return mRequestQueue;
    }
}

最佳答案

经过我们的评论,也许这可以帮助您:

您的请求队列:

static {
    requestQueue = Volley.newRequestQueue(Application.getContext(), new HurlStack(null, ClientSSLSocketFactory.getSocketFactory()));
}

ClientSSLSocketFactory:

public class ClientSSLSocketFactory extends SSLCertificateSocketFactory {
    private SSLContext sslContext;

    public static SSLSocketFactory getSocketFactory(){
        try
        {
            X509TrustManager tm = new X509TrustManager() {
                public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {}

                public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {}

                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };
            sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[] { tm }, null);

            SSLSocketFactory ssf = ClientSSLSocketFactory.getDefault(10000, new SSLSessionCache(Application.getInstance()));

            return ssf;
        } catch (Exception ex) {
            return null;
        }
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
}

关于android - 使用 Volley 时出现 SSL 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30925213/

相关文章:

android - 使用 Smack for Android 通过 XMPP 实现 FCM

android - 使用 Google TV 将分辨率设置为 720p 或 1080p?

android - setInterval 在 Android/Java 中等效?

android - Volley 缓存总是在 android 中返回 null

java - 由于 keystore 文件导致 ssl 握手异常

java - 无法从 json 中读取 URL 字符串并将其应用于 Android 中的对象

php - 如何根据当前登录用户显示所有数据

Android Volley 库不返回整个响应数据

java - Spotify/dockerfile-maven 插件 : Could not build image: javax.net.ssl.SSLException : Unrecognized SSL message, 明文连接

java - SSLException:不支持的记录版本未知