Использование дооснащения отображает responsejavax.net.ssl.SSLHandshakeException error android - PullRequest
1 голос
/ 08 июля 2019

Я использую модификацию для анализа ответа json.Но я получаю ответ об ошибке.

Вот метод retrofitCallBack, который я использую, но я получаю ответ onFailure.

private void retrofitCallBack() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(1, TimeUnit.MINUTES)
                .readTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(15, TimeUnit.SECONDS)
                .build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(SpinnerInterfaces.JSONURL)
                .addConverterFactory(ScalarsConverterFactory.create())
                .client(okHttpClient)
                .build();
        SpinnerInterfaces api = retrofit.create(SpinnerInterfaces.class);
        Call<String> call = api.getJSONString();
        final ProgressDialog progressDialog;
        progressDialog = new ProgressDialog(SpinnerActivity.this);
        progressDialog.setMessage(getString(R.string.loading_message));
        progressDialog.setMax(100);
        progressDialog.show();
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
                Log.e("response","response"+response.body());
                Log.e("response","response"+response.toString());
                progressDialog.dismiss();
                if (response.isSuccessful()) {
                    if (response.body() != null) {
                        String jsonresponse = response.body();
                        spinJSON(jsonresponse);

                    } else {
                        Toast.makeText(SpinnerActivity.this, getString(R.string.response_unsuccessful), Toast.LENGTH_LONG).show();
                    }
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Log.e("response","response"+t);
                Log.e("response","response"+call);
                progressDialog.dismiss();
                Toast.makeText(SpinnerActivity.this, getString(R.string.network_failed), Toast.LENGTH_SHORT)
                        .show();
            }
        });
    }

Ниже приведен интерфейс SpinnerInterface, который я использую.

 public interface SpinnerInterfaces {

    String JSONURL = "https://express-it.optusnet.com.au/";

    @GET("sample.json")
    Call<String> getJSONString();
}

Это сработало месяц назад, но неожиданно не сработало, когда я сегодня проверил этот проект.

Gradle, который я использую:

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.5.0'

Я получаю сообщение об ошибке как:

 responsejavax.net.ssl.SSLHandshakeException: SSL handshake aborted: ssl=0xe631cdf8: I/O error during system call, Connection reset by peer

 responseretrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall@8cea2db

Редактировать:

Я применил это ответ , но я получаю сообщение об ошибке как

E / response: responsejava.net.SocketTimeoutException: истекло время ожидания подтверждения SSL

1 Ответ

0 голосов
/ 08 июля 2019

Я предлагаю вам использовать небезопасный okHttp, самый простой способ решить эту проблему.

Попробуйте это.

OkHttpClient okHttpClient = UnsafeOkHttpClient.getUnsafeOkHttpClient();

Retrofit.Builder builder = new Retrofit.Builder()  
        .baseUrl("https://express-it.optusnet.com.au/")
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build();

SpinnerInterfaces api = retrofit.create(SpinnerInterfaces.class);

Call<String> call = api.getJSONString();  

call.enqueue(new Callback<String>() {  
    @Override
    public void onResponse(Call<String> call, Response<ResponseBody> response) {
        Log.i("response","response"+response.body());
        Log.i("response","response"+response.toString());
        progressDialog.dismiss();
        if (response.isSuccessful()) {
            if (response.body() != null) {
                 String jsonresponse = response.body();
                 spinJSON(jsonresponse);
            } else {
                 Toast.makeText(SpinnerActivity.this, getString(R.string.response_unsuccessful), Toast.LENGTH_LONG).show();
            }
        }
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
        Log.e("response","response"+t);
        Log.e("response","response"+call);
        progressDialog.dismiss();
        Toast.makeText(SpinnerActivity.this, getString(R.string.network_failed), Toast.LENGTH_SHORT).show();
    }
});

UnsafeOkHttpClient
поместите это в тот же или другой файл класса. Это не имеет значения.

public class UnsafeOkHttpClient {  
    public static OkHttpClient getUnsafeOkHttpClient() {
        try {
            // Create a trust manager that does not validate certificate chains
            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
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

            OkHttpClient okHttpClient = builder.build();
            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Исходный учебник futurestud.io

...