gpt4 book ai didi

java - SSLContextImpl 未初始化

转载 作者:太空宇宙 更新时间:2023-11-04 11:59:36 24 4
gpt4 key购买 nike

以下是我的配置

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 次调用,所以其中一些失败,一些成功,对于失败的调用,我们得到以下异常。

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)...

任何人都知道为什么它会间歇性地失败。

最佳答案

在我网上找到的代码片段中,

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 次调用都会尝试一些连接失败。

关于java - SSLContextImpl 未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41047344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com