2017-03-23 3 views
0

J'utilise Retrofit 2.2.0 pour télécharger l'image sur le serveur (en utilisant Java). Avec un appareil Android (Samsung Galaxy S6) API 24 (Build: NRD90M.G920FXXU5EQAC) lorsque je tente de poster une demande, cette demande a échoué avec cette erreurRetrofit 2.2.0 API Android 24 javax.net.ssl.SSLHandshakeException: Échec de la prise de contact

javax.net.ssl.SSLHandshakeException: Handshake failed 

ps: je tente de déclasser l'amélioration 2.1.0 et ça fonctionne parfaitement.

Répondre

5

Je l'ai utilisé avec 2.2.0

Créer un gestionnaire de confiance qui ne valide pas les chaînes de certificats

final TrustManager[] trustAllCerts = new TrustManager[]{ 
       new X509TrustManager() { 
        @Override 
        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { 
        } 

        @Override 
        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { 

        } 

        @Override 
        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
         return new java.security.cert.X509Certificate[]{}; 
        } 
       } 
     }; 

     // Install the all-trusting trust manager 

     HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); 
     httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
     OkHttpClient.Builder client = new OkHttpClient.Builder(); 
     client.interceptors().add(httpLoggingInterceptor); 
     client.readTimeout(180, TimeUnit.SECONDS); 
     client.connectTimeout(180, TimeUnit.SECONDS); 

     KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     keyStore.load(null, null); 

     SSLContext sslContext = SSLContext.getInstance("TLS"); 

     TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     trustManagerFactory.init(keyStore); 
     KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     keyManagerFactory.init(keyStore, "keystore_pass".toCharArray()); 
     sslContext.init(null, trustAllCerts, new SecureRandom()); 
     client.sslSocketFactory(sslContext.getSocketFactory()) 
       .hostnameVerifier(new HostnameVerifier() { 
        @Override 
        public boolean verify(String hostname, SSLSession session) { 
         return true; 
        } 
       }); 

     Gson gson = new GsonBuilder().setLenient().create(); 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Common.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .client(client.build()) 
       .build(); 

     serviceApi = retrofit.create(Api.class); 

grâce espérons que cela vous aidera. Parfois, la version ssl 1.2 ou inférieure n'est pas installée côté serveur.

+1

très utile merci beaucoup – prabu

+1

travaillé pour moi, cependant, j'avais suivi la question. Est-ce que cette correction signifie que vous pourriez être vulnérable car vous accepteriez n'importe quel certificat envoyé au client? –

2

La solution pour moi était d'ajouter plus de chiffres comme acceptable pour OkHttpClient. Depuis API 21, certains certificats TLS sont obsolètes pour Android. Cela pourrait aider:

ConnectionSpec spec = new 
ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) 
       .tlsVersions(TlsVersion.TLS_1_2) 
       .cipherSuites(  
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 
CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,      
CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256) 
       .build(); 

OkHttpClient client = new OkHttpClient.Builder() 
      .connectionSpecs(Collections.singletonList(spec)) 
      .build(); 

Pour plus d'informations s'il vous plaît visitez: https://github.com/square/okhttp/wiki/HTTPS

+0

Ne travaillait pas pour moi. –