2015-09-13 1 views
0

J'ai fait une application pour une entreprise et elle supportait le niveau API 13+ (3.0+). Il collecte les données de leur CMS via XML et les affiche sur l'application. Ceci est fait sur HTTPS qui a bien fonctionné jusqu'à ce qu'ils aient mis à jour leur serveur à TLS 1.2. Maintenant, les versions Android ci-dessous API niveau 20 ne va pas chercher le XML en raison de SSLPeerUnverifiedException et beaucoup de téléphones ne peuvent plus voir cette application.Android <= 4.4.2 et TLS 1.2

Existe-t-il un moyen de dépasser SSLPeerUnverified tout en laissant TLS 1.2 activé?

Note: Les certificats SSL actuels sont les suivants:

AddTrust External CA Root 
--> COMODO High-Assurance Secure Server CA 
    --> *.appdomain.com 

article SOF plus utile à ce jour: Implementing TLS 1.2 on Android 2.3.3

+0

pas sûr mais -> TLSv1.2 est soutenu par api 16+ - https://developer.android.com/reference/javax/net/ssl/SSLSocket.html - il devrait y avoir une solution pour le problème - en fait, il est activé par défaut sur le socket serveur pour l'API 16+, mais pas sur le client – Tasos

+0

@Tasos Vous avez raison. J'utilise actuellement 'HttpClient' et j'ai essayé de le configurer' SocketFactory' dans une classe personnalisée qui active * TLS 1.2 * par défaut. Cela n'a pas encore fonctionné mais c'est un début. – Jacksonkr

Répondre

1

Une autre personne de l'équipe a répondu cela, mais le résultat comprenait les éléments suivants:

  • SSLContext helper=null;
  • helper.init(null,null,null);
  • SSLContext.getInstance("TLSv1.2");
  • SSLEngine engine = helper.createSSLEngine();

Voici la fonction qu'il a utilisé pour vérifier ssl et de mettre tout:

public void sslCheck() { 

     int PLAY_SERVICES_RESOLUTION_REQUEST=9000; 
     int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 
     //Log.i("log_tag2", String.valueOf(resultCode)); 
     if (resultCode != ConnectionResult.SUCCESS) { 
      if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { 
       Log.i("log_tag2","Not good!"); 
       if (MyAppActivity.instance != null) { 
        Log.i("log_tag2","but can fix"); 
        GooglePlayServicesUtil.getErrorDialog(
          resultCode, 
          MyAppActivity.instance, 
          PLAY_SERVICES_RESOLUTION_REQUEST).show(); 
       } 
      } 
     } 
     else { 
      Log.i("log_tag2","Already good!"); 
      try { 
       ProviderInstaller.installIfNeeded(this); 
       Log.i("log_tag", "1"); 
      } catch (GooglePlayServicesRepairableException e) { 
       e.printStackTrace(); 
      } catch (GooglePlayServicesNotAvailableException e) { 
       e.printStackTrace(); 
      } 
      SSLContext helper=null; 
      try { 
       helper = SSLContext.getInstance("TLSv1.2"); 
       Log.i("log_tag","2"); 
      } catch (NoSuchAlgorithmException e) { 
       e.printStackTrace(); 
      } 
      try { 
       helper.init(null,null,null); 
       Log.i("log_tag", "3"); 
      } catch (KeyManagementException e) { 
       e.printStackTrace(); 
      } 
      SSLEngine engine = helper.createSSLEngine(); 
     } 
    } 
+0

Que se passe-t-il avec 'engine'? – Bolic

+0

Okay. Merci j'ai tout compris. Assurez-vous que vos services Google Play sont à jour sur l'appareil. Utilisez la méthode Jackson présentée et renvoyez l'assistant SSLContext et travaillez normalement lorsque vous utilisez HttpsUrlConnection – Bolic