2015-09-13 3 views
0

Я сделал приложение для компании и поддерживал уровень API 13+ (3.0+). Он собирает данные с их CMS через XML и отображает их в приложении. Это делается через HTTPS, который отлично работал, пока не обновил свой сервер до TLS 1.2. Теперь версии для Android ниже уровня API 20 не будут извлекать XML из-за SSLPeerUnverifiedException, и многие телефоны больше не смогут видеть это приложение.Android <= 4.4.2 и TLS 1.2

Есть ли способ пройти SSLPeerUnverified, оставив TLS 1.2 включенным?

Примечание: Действующие сертификаты SSL следующим образом:

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

Наиболее полезный СФБ статью до сих пор: Implementing TLS 1.2 on Android 2.3.3

+0

не уверен, но -> TLSv1.2 не поддерживается API 16+ - https://developer.android.com/reference/javax/net/ssl/SSLSocket.html - значит, должно быть решение проблемы - на самом деле оно включено по умолчанию в гнездо сервера для api 16+, но не включено клиент – Tasos

+0

@Tasos Вы правы. В настоящее время я использую 'HttpClient' и пытаюсь установить его' SocketFactory' в пользовательский класс, который позволяет * TLS 1.2 * по умолчанию. Это еще не сработало, но это начало. – Jacksonkr

ответ

1

Кто-то еще в команде ответили это, но результат включал следующее:

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

Вот функция, он используется для проверки защищенных и поставить все в:

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

Что происходит с 'engine'? – Bolic

+0

Хорошо. Спасибо, я все понял. Убедитесь, что ваши службы Google Play обновлены на устройстве. Используйте метод, предложенный Джексоном и возвращающий помощник SSLContext, и работайте с ним, как обычно, при использовании HttpsUrlConnection – Bolic

Смежные вопросы