SSLContextImpl не инициализирован

Ниже мои настройки

версия java "1.8.0_101" Java(TM) SE Runtime Environment (сборка 1.8.0_101-b13) Java HotSpot(TM) 64-битный сервер VM (сборка 25.101-b13, смешанный режим)

Использование Apache httpclient v4.4 для вызова службы Restful. URL-адрес службы имеет действительный сертификат (SHA2)

Используя apache httpclient, мы вызываем службу. Ниже приведен код

private static CloseableHttpClient appHttpClient() throws Exception {
    if (null != httpclient) {
        return httpclient;
    }
    final Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
            .<ConnectionSocketFactory> create().register("http", PlainConnectionSocketFactory.INSTANCE)
            .register("https", new SSLConnectionSocketFactory(trustAllSSLContext())).build();

    final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
    cm.setMaxTotal(HTTP_MAX_CON);
    cm.setDefaultMaxPerRoute(HTTP_CON_ROUTE);

    final RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(HTTP_CON_TO)
            .setConnectionRequestTimeout(HTTP_REQ_CON_TO).setSocketTimeout(HTTP_SO_TO).build();

    // final SSLConnectionSocketFactory factory = new
    // SSLConnectionSocketFactory(getSSLContext());

    httpclient = HttpClients.custom().setConnectionManager(cm).setDefaultRequestConfig(requestConfig).build();

    return httpclient;
}

public static SSLContext trustAllSSLContext() throws Exception {
    if (sslContext != null) {
        return sslContext;
    }
    sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init(null, null, null);
    System.out.println(
            "SSLContext :: Protocol :: " + sslContext.getProtocol() + " Provider :: " + sslContext.getProvider());
    return sslContext;
}

Вызов службы периодически терпит неудачу, существует пакетный процесс, который вызывает наши службы в цикле, скажем, 30 вызовов служб, поэтому некоторые из них терпят неудачу, а некоторые из них успешны, для неудачных вызовов мы получаем исключение ниже.

java.lang.IllegalStateException: SSLContextImpl is not initialized
   at sun.security.ssl.SSLContextImpl.engineGetSocketFactory(SSLContextImpl.java:181)
   at javax.net.ssl.SSLContext.getSocketFactory(SSLContext.java:294)
   at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<init>(SSLConnectionSocketFactory.java:262)
   at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<init>(SSLConnectionSocketFactory.java:205)
   at com.wdpr.payment.helper.HttpHelper.appHttpClient(HttpHelper.java:63)
   at com.wdpr.payment.helper.HttpHelper.makePostCall(HttpHelper.java:142)...

У кого-нибудь есть идеи, почему это исключение периодически выходит из строя.


person Shantanoo K    schedule 08.12.2016    source источник
comment
Может кто-нибудь, пожалуйста, помогите мне здесь? это происходит из-за того, что я форсирую соединение TLSv1.2 или что-то еще   -  person Shantanoo K    schedule 09.12.2016
comment
Можете ли вы поместить код, который вы используете для вызова appHttpClient(), и где вы объявляете sslContext?   -  person Imesha Sudasingha    schedule 22.12.2016
comment
Эти методы не являются потокобезопасными. Их нужно синхронизировать.   -  person user207421    schedule 27.01.2019
comment
И ваш метод trustAllSSLContext() не возвращает ничего подобного, просто SSLContext обычного вида только для TLS 1.2.   -  person user207421    schedule 26.01.2020


Ответы (2)


В фрагментах кода, которые я нашел в Интернете,

sslContext = SSLContext.getInstance("");

был вызван с «SSL» вместо «TLSv1.2».

Чтобы заставить сокеты ssl использовать TLSv1.2, я использовал Как заставить Commons HTTPClient 3.1 использовать TLS 1.2 только для HTTPS?

(редактировать)

Возможно, связанная с этим заметка: при использовании Http Commons MultiThreadedHttpConnectionManager мы должны вызывать

manager.closeIdleConnections(10000); 
manager.deleteClosedConnections();

после каждого http-вызова, в противном случае мы экспериментируем с некоторыми сбоями соединения каждые N вызовов.

person louisgab    schedule 23.03.2017

Если «URL-адрес службы имеет действительный сертификат» верно, просто удалите все настройки, связанные с SSL.

Этот (доверяйте им всем):

new SSLConnectionSocketFactory(trustAllSSLContext())

на самом деле является взломом для недействительных сертификатов, как быстрое решение - попробуйте добавить 'synchronized' к trustAllSSLContext.

person Alex Chernyshev    schedule 26.01.2020