javax.net.ssl.SSLHandshakeException? - PullRequest
       38

javax.net.ssl.SSLHandshakeException?

0 голосов
/ 21 ноября 2018

Я пытаюсь подключиться к серверу WCF, используя соединение HTTPS (класс UrlHttpsConnection), и всегда получаю сообщение об ошибке «Доверенный якорь для пути сертификации не найден».Я нашел тысячи примеров в Интернете об этой проблеме, но ничего, что действительно помогло мне.

Моя служба WCF работает с сертификатом, подписанным внутренним центром сертификации, который был добавлен в список доверенных центров сертификации на моем смартфоне.Если я звоню по номеру https://myserver/myservice/test из Chrome на моем смартфоне, у меня больше не появляется предупреждение, сертификат считается действительным.Из моего приложения я получаю сообщение об ошибке.

Знаете ли вы, почему мое приложение не считает сертификат сервера действительным, в отличие от Chrome?Как я могу это исправить?

Из соображений безопасности я не хочу игнорировать проверку SSL.

Заранее благодарю за ваши предложения.

1 Ответ

0 голосов
/ 21 ноября 2018

Попробуйте, но я использовал модификацию для вызова API.

  public class ApiClient {
//public final static String BASE_URL = "https://prod.appowiz.com/app/services/";
public final static String BASE_URL_SECURE = "Pass your url";

public static ApiClient apiClient;

private Retrofit retrofit = null;
private static Retrofit storeRetrofit = null;

public Retrofit getClient(Context context) {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

    retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL_SECURE)
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build();


    return retrofit;
}
 public static Retrofit getStore() {
    if (storeRetrofit == null) {
        final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            @Override
            public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {

            }


            @Override
            public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {

            }


            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {

                return new java.security.cert.X509Certificate[0];
            }
        }};

        // Install the all-trusting trust manager
        final SSLContext sslContext;
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        try {
            sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            final OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .addInterceptor(interceptor)
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(10, TimeUnit.SECONDS)
                    .readTimeout(30, TimeUnit.SECONDS)
                    .sslSocketFactory(sslSocketFactory).hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
                    .build();
            storeRetrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL_SECURE)
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(okHttpClient)
                    .build();


        } catch (NoSuchAlgorithmException | KeyManagementException e1) {
            CustomLogHandler.printErrorlog(e1);
        }

    }

    return storeRetrofit;
}

для вызова API. Создайте интерфейс.

public interface ApiInterface {

@POST("device/add_device_name")
Call<AddDeviceNameVo> addDeviceName(@Body JsonObject body);

 }

вызвал API в действие или фрагмент, подобный этому..

        apiInterface = ApiClient.getStore().create(ApiInterface.class);
...