дооснащение + охттп на андроид 4 ссл - PullRequest
5 голосов
/ 16 апреля 2019

Я обнаружил, что android 4 плохо работает с ssl, при попытке связаться с API через https это вызывает сбой

javax.net.ssl.SSLException: SSL рукопожатие прервано:ssl = 0xb8dbad20: ошибка ввода-вывода во время системного вызова, сброс соединения по пиру

Вот что я пробовал из других подобных вопросов:

   if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 22) {
        try {
            Logger.e("under lolipop");
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, new TrustManager[] { new MyTrustManager() }, new SecureRandom());
            client.sslSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
            Logger.e("HTTPS"+ e.getMessage() );
        }
    }

Что не повлияло на результат

И

 if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 22) {

        try {
            client.sslSocketFactory(new TLSSocketFactory(), (X509TrustManager)trustAllCerts[0])
                    .build();
            Logger.e("SETUP TRUST SSL");
            return client.build();
        } catch (KeyManagementException e) {
            Logger.e("SETUP TRUST SSL Failed "+e.getMessage());

            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            Logger.e("SETUP TRUST SSL Failed "+e.getMessage());

            e.printStackTrace();
        }
    }
    return client.build();

}
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[0];
    }
} };

Этот код выдает другую ошибку:

java.security.cert.CertPathValidatorException: доверительный якорь для пути сертификации не найден.

Есть ли что-то, чтобы это исправить, я должен поддерживать Android 4, а также использовать https,

Любая помощь подойдет!

Ответы [ 2 ]

10 голосов
/ 20 апреля 2019

Я столкнулся с подобной проблемой на Android 4.4 некоторое время назад, когда наш бэкэнд прекратил поддержку TLS 1.0 и 1.1. Я решил эту проблему, установив новый поставщик безопасности с помощью Google Play Services ProviderInstaller.

В вашем приложении gradle.build добавьте файл

implementation "com.google.android.gms:play-services-auth:16.0.1"

В вашем стартапе Activity звоните ProviderInstaller.installIfNeeded() как можно раньше. Вот пример метода, который пытается установить провайдера:

private static void installGooglePlayServicesProvider(Context context) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //Devices with Android 5.1+ should support TLS 1.x out of the box
        try {
            ProviderInstaller.installIfNeeded(context);
        } catch (GooglePlayServicesRepairableException e) {
            Log.e("ProviderInstaller", "Google Play Services is out of date!", e);
            GoogleApiAvailability.getInstance().showErrorNotification(context, e.getConnectionStatusCode());
        } catch (GooglePlayServicesNotAvailableException e) {
            Log.e("ProviderInstaller", "Google Play Services is unavailable!", e);
        }
    }
}

Для получения дополнительной информации о ProviderInstaller см. Страницу разработчика Goolge: Исправление провайдера безопасности с помощью ProviderInstaller

При использовании TLS 1.2 может потребоваться принудительно включить поддержку на некоторых устройствах. Взгляните на следующую статью и их реализацию Tls12SocketFactory: Работа с TLS 1.2 на Android 4.4 и ниже

0 голосов
/ 23 апреля 2019

Okhttp 3.13.x прекратил поддержку TLS1.2 и ниже и поддерживает только Android API 21+. Вам придется использовать ветку версии Okhttp 3.12.x для ее использования на устройствах Android 4.x.

Подробнее здесь

...