以下是我的配置
java版“1.8.0_101” Java(TM)SE运行时环境(版本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次调用,因此其中一些是失败的,其中一些是成功的,因为失败的调用我们得到的是异常。 / p>
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 :(得分:1)
如果“服务URL具有有效证书”为true,请删除所有与SSL相关的自定义内容。
这个(相信他们所有的方法):
new SSLConnectionSocketFactory(trustAllSSLContext())
实际上是对无效证书的一种破解,作为快速解决方案-尝试将'synchronized
'添加到trustAllSSLContext
方法中。
答案 1 :(得分:0)
在我在网上找到的代码片段中,
sslContext = SSLContext.getInstance("");
用&#34; SSL&#34;调用而不是&#34; TLSv1.2&#34;。
为了强制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次调用时尝试一些连接失败。