Android ‹= 4.4.2 и TLS 1.2

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

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

Примечание. Текущие SSL-сертификаты следующие:

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

Самая полезная статья SOF на данный момент: Реализация TLS 1.2 на Android 2.3. 3


person Jacksonkr    schedule 13.09.2015    source источник
comment
не уверен, но --› TLSv1.2 поддерживается API 16+ -- developer.android.com/reference/javax/net/ssl/SSLSocket.html - так что должно быть решение проблемы - на самом деле он включен по умолчанию в сокете сервера для API 16+, но не на клиенте   -  person Tasos    schedule 13.09.2015
comment
@Tasos Ты прав. В настоящее время я использую HttpClient и попытался установить для него SocketFactory пользовательский класс, который по умолчанию включает TLS 1.2. Это еще не сработало, но это только начало.   -  person Jacksonkr    schedule 17.09.2015


Ответы (1)


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

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

Вот функция, которую он использовал, чтобы проверить ssl и все вставить:

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();
        }
    }
person Jacksonkr    schedule 17.11.2015
comment
Что происходит с engine? - person Bolic; 26.11.2015
comment
Хорошо. Спасибо я все понял. Убедитесь, что ваши сервисы Google Play обновлены на устройстве. Используйте метод, представленный Джексоном, и верните помощник SSLContext и работайте как обычно, когда вы используете HttpsUrlConnection. - person Bolic; 26.11.2015