Модернизация 2.2.0 Android API 24 javax.net.ssl.SSLHandshakeException: сбой рукопожатия

Я использую Retrofit 2.2.0 для загрузки изображения на сервер (с использованием Java). С устройством Android (Samsung galaxy S6) API 24 (сборка: NRD90M.G920FXXU5EQAC), когда я пытаюсь опубликовать запрос, этот запрос завершается с ошибкой

javax.net.ssl.SSLHandshakeException: Handshake failed

PS: я пытаюсь понизить версию Retrofit 2.1.0, и она отлично работает.


person kekev76    schedule 23.03.2017    source источник
comment
попробуйте ваш URL с http не https.   -  person Reza    schedule 30.06.2021


Ответы (2)


Решение для меня заключалось в том, чтобы добавить больше шифров, приемлемых для OkHttpClient. Начиная с API 21 некоторые сертификаты TLS устарели для Android. Это может помочь:

ConnectionSpec spec = new 
ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                .tlsVersions(TlsVersion.TLS_1_2)
                .cipherSuites(      
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,                    
CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
                .build();

OkHttpClient client = new OkHttpClient.Builder()
            .connectionSpecs(Collections.singletonList(spec))
            .build();

Для получения дополнительной информации посетите: https://github.com/square/okhttp/wiki/HTTPS

person Daniil Yakovlev    schedule 08.06.2017

Я использовал его с 2.2.0

Создайте диспетчер доверия, который не проверяет цепочки сертификатов.

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

        // Install the all-trusting trust manager

        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient.Builder client = new OkHttpClient.Builder();
        client.interceptors().add(httpLoggingInterceptor);
        client.readTimeout(180, TimeUnit.SECONDS);
        client.connectTimeout(180, TimeUnit.SECONDS);

        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
       keyStore.load(null, null);

        SSLContext sslContext = SSLContext.getInstance("TLS");

        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
       trustManagerFactory.init(keyStore);
        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyManagerFactory.init(keyStore, "keystore_pass".toCharArray());
        sslContext.init(null, trustAllCerts, new SecureRandom());
        client.sslSocketFactory(sslContext.getSocketFactory())
                .hostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
               });

        Gson gson = new GsonBuilder().setLenient().create();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Common.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(client.build())
                .build();

        serviceApi = retrofit.create(Api.class);

спасибо, надеюсь, это поможет вам. Иногда ssl версии 1.2 или ниже также не устанавливается на стороне сервера.

person Saveen    schedule 23.03.2017
comment
Работал для меня, однако, у меня был дополнительный вопрос. Означает ли это исправление, что вы можете быть уязвимы, поскольку вы принимаете любой сертификат, отправленный клиенту? - person Abhishek Dewan; 13.09.2017
comment
что такое keystore_pass здесь? - person Kameswari; 04.07.2019
comment
У меня не сработало, к тому же принятие всего делает приложение уязвимым. - person Neeraj Sewani; 07.09.2019