2016-12-08 3 views
0

Ниже приведены мои конфигурацииSSLContextImpl не инициализируется

ява версия "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)... 

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

+0

Может кто-нибудь, пожалуйста, помогите мне здесь? это происходит потому, что я заставляю TLSv1.2 соединение или что-то еще –

+0

Можете ли вы поместить код, который вы используете для вызова 'appHttpClient()', и где вы объявляете 'sslContext'? –

ответ

0

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

sslContext = SSLContext.getInstance(""); 

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

Чтобы заставить SSL сокетов использовать TLSv1.2, я использовал How to force Commons HTTPClient 3.1 to use TLS 1.2 only for HTTPS?

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

На соответствующую записку, возможно, при использовании Http Commons MultiThreadedHttpConnectionManager, мы должны назвать

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

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

Смежные вопросы