Почему URL с поддержкой TLSV1.2 работал только с сертификатами на android 4.4, но не без него - PullRequest
0 голосов
/ 16 января 2020

Я звоню API с устройства версии android 4.4, которое поддерживает только TLSV1.2, вы можете проверить здесь . Так что, если я добавляю сертификаты в запрос, он работает нормально, но API не требует никаких сертификатов, поэтому без сертификатов

не может найти приемлемое исключение протокола.

Я попытался включить TLSV1.2, используя следующий код:

ConnectionSpec requireTls12 = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                .tlsVersions(TlsVersion.TLS_1_2)
                .build();
        OkHttpClient client = new OkHttpClient.Builder()
                .connectionSpecs(Arrays.asList(requireTls12))
                .build();

        return client.newBuilder().build();

и все другие решения

Я не могу использовать ProviderInstaller из Служб Google Play для его включения, поскольку на моем устройстве не установлены службы Google Play.

это рабочий код с клиентскими сертификатами:

CertificateFactory certificateFactory = null;
        Certificate certificate = null;
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        try {
            certificateFactory = CertificateFactory.getInstance("X.509");
            certificate = certificateFactory.generateCertificate(certInputStream);
            // Create a KeyStore containing our trusted CAs
            String keyStoreType = KeyStore.getDefaultType();
            KeyStore keyStore = KeyStore.getInstance(keyStoreType);
            keyStore.load(null, null);
            keyStore.setCertificateEntry("ca", certificate);

            // Create a TrustManager that trusts the CAs in our KeyStore
            String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
            tmf.init(keyStore);

            // Create an SSLContext that uses our TrustManager
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, tmf.getTrustManagers(), null);

            //Initialize Interceptors
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);

            //Assign custom trusted ssl to builder
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            builder.sslSocketFactory(sslSocketFactory);
            builder.addInterceptor(loggingInterceptor);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } 

Может кто-нибудь предложить решение для этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...