2015-07-17 10 views
7

ich meine App Fehler bin ständig überwacht, und ich sehe den folgenden Fehler zu oftWarum fällt Volley auf SSLV3 zurück?

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xb8f0fc28: Failure in SSL library, usually a protocol error 

Fehler: 14077410: SSL-Routinen: SSL23_GET_SERVER_HELLO: SSLv3 Alarm Handshake-Fehler (extern/openssl/ssl/s23_clnt.c: 741 0xaa48cd5c: 0x00000000) -javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL-Handshake abgebrochen: ssl = 0xb8f0fc28: Fehler in der SSL-Bibliothek, normalerweise ein Protokollfehler Fehler: 14077410: SSL-Routinen: SSL23_GET_SERVER_HELLO: sslv3 alert Handshake-Fehler (extern/openssl/ssl/s23_clnt.c: 741 0xaa48cd5c: 0x00000000)

Sie die den Fehler sehen kann, ist etwa SSLV3 und mein Server su Nur Port TLSV1.2.

Es scheint, dass auf einigen Clients Volley zurück fällt, um SSLV3 (aus irgendeinem Grund) zu verwenden, und sie erhalten einen Fehler.

Benutzer, die diesen Fehler erhalten, sind auf Android 4.4.2, 4.4.4 und 4.1.1 und mehr.

Interessanterweise benutze ich auch DefaultHttpClient in der gleichen Anwendung, aber es scheint nicht das gleiche Problem zu melden.

Ich bin mit dem Standard-HurlStack in Volley

Ich habe folgende ... Disable SSL as a protocol in HttpsURLConnection

und https://code.google.com/p/android/issues/detail?id=78187

Also, was sind meine Optionen gesehen?

  1. Ist meine Annahme korrekt, dass Volley auf SSLV3 zurückfällt?

  2. Warum Fallback auf SSLV3? Mit anderen Worten: Was war der ursprüngliche Fehler, der das Problem verursacht hat und wie es gelöst werden kann?

  3. Ich habe kürzlich Volley heruntergeladen, aber ich bin mir nicht sicher, ob es das Neueste ist. Wie finde ich welche Version ich habe?

Irgendwelche Gedanken?

+0

niemand zur Rettung? –

+0

Ich würde http://stackoverflow.com/questions/24357863/making-sslengine-use-tlsv1-2-on-android-4-4-2 – mattm

Antwort

2

Ihr Server unterstützt SSLv3 nicht gut, da es einige Sicherheitsprobleme hat und nicht verwendet werden sollte.

Wenn Android-Versionen vor Kitkat verwenden, müssen Sie eine Socket-Factory verwenden, die SSLv3 entfernt als Standardkonfiguration verwendet werden:

public class VolleyToolboxExtension extends Volley { 
    /** Default on-disk cache directory. */ 
    private static final String DEFAULT_CACHE_DIR = "volley"; 

    /** 
    * Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it. 
    * 
    * @param context A {@link Context} to use for creating the cache dir. 
    * @param stack An {@link HttpStack} to use for the network, or null for default. 
    * @return A started {@link RequestQueue} instance. 
    */ 
    public static RequestQueue newRequestQueue(Context context, HttpStack stack) { 
     File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR); 
     String userAgent = "volley/0"; 
     try { 
      String packageName = context.getPackageName(); 
      PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); 
      userAgent = packageName + "/" + info.versionCode; 
     } catch (PackageManager.NameNotFoundException e) { 

     } 
     if (stack == null) { 
      if (Build.VERSION.SDK_INT >= 9) { 
       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
        // Use a socket factory that removes sslv3 
        stack = new HurlStack(null, new NoSSLv3Compat.NoSSLv3Factory()); 
       } else { 
        stack = new HurlStack(); 
       } 
      } else { 
       // Prior to Gingerbread, HttpUrlConnection was unreliable. 
       // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html 
       stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent)); 
      } 
     } 
     Network network = new BasicNetwork(stack); 
     RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network); 
     queue.start(); 
     return queue; 
    } 

    /** 
    * Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it. 
    * 
    * @param context A {@link Context} to use for creating the cache dir. 
    * @return A started {@link RequestQueue} instance. 
    */ 
    public static RequestQueue newRequestQueue(Context context) { 
     return newRequestQueue(context, null); 
    } 

} 

NoSSLv3Compat Klasse finden sich hier: diese Erweiterung https://github.com/Floens/volley/blob/master/src/com/android/volley/compat/NoSSLv3Compat.java

Verwenden Erstellen Sie Ihre Anfrage Queue:

/** 
    * @return The Volley Request queue, the queue will be created if it is null 
    */ 
    public RequestQueue getRequestQueue() { 
     // lazy initialize the request queue, the queue instance will be 
     // created when it is accessed for the first time 
     if (mRequestQueue == null) { 
      // Create the request queue 
      mRequestQueue = VolleyToolboxExtension.newRequestQueue(getApplicationContext()); 
     } 

     return mRequestQueue; 
    } 

Sie könnten auch Retrofit anstelle von Voll verwenden ey, da Square den 2.1-Version dieser Bibliothek, die TLS-Version Konfiguration unterstützt:

http://square.github.io/retrofit/

+0

untersuchen wo finde ich 'DelegateSSLSocket', die Sie hier' Private erweitern Die statische Klasse NoSSLv3SSLSocket erweitert DelegateSSLSocket {' –