Как мне сообщить версию TLS в Android Volley

Мой проект долгое время использовал сетевую среду Android Volley, но недавно я обнаружил ошибку протокола SSL 3.0, опубликованную в Интернете.

Я хочу знать, как узнать, какую версию TLS использовал мой проект, и как проверить, обновлена ​​ли библиотека.

Вот мой фрагмент исходного кода:

HttpStack stack = new HurlStack();
Network network = new BasicNetwork(stack);
mHttpRequestQueue = new RequestQueue(new NoCache(), network);
mHttpRequestQueue.start();

Я думаю, что дело в классе HurlStack, и это зависит от org.apache.http пакет, но я не могу понять, где находится конфигурация TLS/SSL.

3 ответа

Решение

Вы можете изменить версию TLS, используемую в Volley, создав собственный HTTPStack и установив стек в Volley.newRequestQueue(context, httpStack) метод в Volley.java. Хотя это нужно делать только для версий Android 16-19. До версии 16 TLS 1.2 не поддерживается, а после версии 19 TLS 1.2 включен по умолчанию. Таким образом, вы должны сосредоточиться на ручной настройке TLS на 1.2 для версий Android 16-19.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN
    && Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
    try {
      ProviderInstaller.installIfNeeded(getContext());
    } catch (GooglePlayServicesRepairableException e) {
      // Indicates that Google Play services is out of date, disabled, etc.
      // Prompt the user to install/update/enable Google Play services.
      GooglePlayServicesUtil.showErrorNotification(e.getConnectionStatusCode(), getContext());
      // Notify the SyncManager that a soft error occurred.
      syncResult.stats.numIOExceptions++;
      return;
    } catch (GooglePlayServicesNotAvailableException e) {
      // Indicates a non-recoverable error; the ProviderInstaller is not able
      // to install an up-to-date Provider.
      // Notify the SyncManager that a hard error occurred.
      syncResult.stats.numAuthExceptions++;
      return;
    }

    HttpStack stack = null;
    try {
      stack = new HurlStack(null, new TLSSocketFactory());
    } catch (KeyManagementException e) {
      e.printStackTrace();
      Log.d("Your Wrapper Class", "Could not create new stack for TLS v1.2");
      stack = new HurlStack();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
      Log.d("Your Wrapper Class", "Could not create new stack for TLS v1.2");
      stack = new HurlStack();
    }
    requestQueue = Volley.newRequestQueue(context, stack);
} else {
  requestQueue = Volley.newRequestQueue(context);
}

А затем используйте класс TLSSocketFactory, который расширяет SSLSocketFactory, как тот, который был создан здесь Флорианом Кротаном, где включен протокол TLS v1.2: https://gist.github.com/fkrauthan/ac8624466a4dee4fd02f

На Android используемая версия TLS в основном зависит от используемой версии Android. Apache Volley основан на Apache Http Client, который основан на HttpsUrlConnection, поэтому используется стандартный SSL/TLS SSLSocketFactory.

На Android ниже 4.3 обычно поддерживаются только SSLv3 и TLS 1.0. В более поздних версиях TLS 1.1 и 1.2 часто поддерживаются, но отключены.

Начиная с Android 5 TLS 1.1 и TLS 1.2 поддерживаются и включены по умолчанию

Ответ @w3bshark работал на меня. Но перед использованием этого кода убедитесь, что вы включили код для обновления провайдера безопасности. В моем случае TLS не работал, пока я не обновлю провайдера безопасности. Ниже приведен код для его обновления.

private void updateAndroidSecurityProvider() {
    try {
        ProviderInstaller.installIfNeeded(this);
    } catch (GooglePlayServicesRepairableException e) {
        Log.e("Test321", "PlayServices not installed");
    } catch (GooglePlayServicesNotAvailableException e) {
        Log.e("Test321", "Google Play Services not available.");
    }
}
Другие вопросы по тегам