2015-12-28 9 views
17

Kod działa na moim emulatorze Genymotion Android 4.4.4, ale nie na używanym urządzeniu (4.4.2).Android 4.4.2 Uzgadnianie protokołu SSL przerwane

Próbowałem wielu rozwiązań typu "zaufaj wszystkiemu certyfikatowi", ale bez skutku (nie sądzę, że to jest problem, ponieważ certyfikat jest AOK).

Myślę, że zidentyfikowałem szyfr (za pomocą śladu wireshark z mojego pulpitu); TLS 0x00 0x1E, który wydaje się być dość rzadki?

Każdy pomysł, jak to naprawić?

Oto mój kod

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
CloseableHttpClient client = HttpClientBuilder.create().setSSLSocketFactory(sslsf).build(); 
String baseURL = "https://mysite.co.uk/api/"; 
HttpGetHC4 request = new HttpGetHC4(baseURL + "/authenticate?user=abcd&password=1234"); 
CloseableHttpResponse response = client.execute(request); 

i błędów;

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x6abff398: Failure in SSL library, usually a protocol error 
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:744 0x684dfce0:0x00000000) 
    at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:449) 
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:340) 
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:281) 
    at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:124) 
    at org.apache.http.impl.conn.BasicHttpClientConnectionManager.connect(BasicHttpClientConnectionManager.java:322) 
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:373) 
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:225) 
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) 
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86) 
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) 
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:178) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106) 
    at com.example.lee.printticket.Main$OrderAsyncTask.onPostExecute(Main.java:239) 
    at com.example.lee.printticket.Main$OrderAsyncTask.onPostExecute(Main.java:189) 
    at android.os.AsyncTask.finish(AsyncTask.java:632) 
    at android.os.AsyncTask.access$600(AsyncTask.java:177) 
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5017) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x6abff398: Failure in SSL library, usually a protocol error 
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:744 0x684dfce0:0x00000000) 
    at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) 
    at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:406) 
    ... 25 more 

EDIT

Próby z zastosowaniem innej techniki/biblioteki;

 RequestQueue queue = Volley.newRequestQueue(this); 
     String url ="https://mysite.co.uk/api/authenticate?user=abcd&password=1234"; 

     // Request a string response from the provided URL. 
     StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         // Display the first 500 characters of the response string. 
         Log.d("response: ", response); 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.d("response: ", error.toString()); 
      } 
     }); 
     // Add the request to the RequestQueue. 
     queue.add(stringRequest); 

Zwroty;

D/response:: com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x6ad51be0: Failure in SSL library, usually a protocol error 
D/response:: error:140740B5:SSL routines:SSL23_CLIENT_HELLO:no ciphers available (external/openssl/ssl/s23_clnt.c:486 0x684dfce0:0x00000000) 

lub przy NoSSLv3SocketFactory siekać z Javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: Failure in SSL library, usually a protocol error;

 HttpStack stack = new HurlStack(null, new NoSSLv3SocketFactory()); 
     RequestQueue queue = Volley.newRequestQueue(this, stack); 

Zwroty;

D/response:: com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x6ae51d30: Failure in SSL library, usually a protocol error 
D/response:: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:744 0x684dfce0:0x00000000) 
+2

Chyba dużo szukałeś, ale czy widziałeś to ?: http://stackoverflow.com/questions/29916962/javax-net-ssl-sslhandshakeexception-javax-net-ssl-sslprotocolexception-ssl- han – Opiatefuchs

+0

Zrobiłem, jednak nie mogę się dowiedzieć, jak zastosować NoSSLv3SocketFactory do CloseableHttpClient. Jeśli spróbuję czegoś takiego jak 'SSLSocketFactory nosslv3 = new NoSSLv3SocketFactory (sslc.getSocketFactory()); CloseableHttpClient client = HttpClientBuilder.create(). SetSSLSocketFactory (nosslv3) .build(); 'Otrzymuję' setSSLSocketFactory (org.apache.http.conn.socket.LayeredConnectionSocketFactory w HttpClientBuilder nie można zastosować do javax.net.ssl.SSLSocketFactory'A –

+0

0x00,0x1E to TLS_KRB5_WITH_DES_CBC_SHA i byłoby naprawdę bardzo rzadkie, a także bardzo niepewne.Wątpię, czy ten szyfr byłby zgodny z systemem Android 4.4.4 Zamiast tego mógłbym założyć problemy z nazwą serwera, ale więcej można powiedzieć tylko wtedy, gdy ktoś wie więcej na temat Sprawdź [SSLLabs] (https://www.ssllabs.com/ssltest/analyze.html) pod kątem problemów związanych z konkretnymi wersjami systemu Android lub jeśli witryna wymaga SNI –

Odpowiedz

0

Spróbuj tego:

public class ClientSSLSocketFactory { 

    public static SSLSocketFactory getSocketFactory(Context context) { 
     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 new X509Certificate[0]; 
       } 
      }; 
      SSLContext ctx = SSLContext.getInstance("TLS"); 
      ctx.init(null, new TrustManager[]{tm}, new SecureRandom()); 

      SSLSocketFactory ssf = SSLCertificateSocketFactory.getDefault(10000, new SSLSessionCache(context)); 
      return ssf; 
     } catch (Exception ex) { 
      Log.e("ssl", "Error during the getSocketFactory"); 
      ex.printStackTrace(); 
      return null; 
     } 
    } 
} 

I podczas tworzenia kolejki:

sRequestQueue = Volley.newRequestQueue(context, new HurlStack(null, ClientSSLSocketFactory.getSocketFactory())); 

Nadzieję, że to pomaga.

Powiązane problemy