Мы получаем «Ошибка цепочки сертификатов» при использовании Apache CXF WebClient (версия - 3.3.4) в Websphere 8.5 (IBM JDK 8) для вызова запроса PATCH с помощью «use.asyn c .http.conduit». ». Мы использовали «tlsClientParameters.setUseHttpsURLConnectionDefaultSslSocketFactory (true)» для исправления проблемы с сертификатом для других запросов - «POST / GET», которые не используют «use.asyn c .http.conduit». Мы попытались вручную установить TrustManagers и KeyManager, но ничего не работает с PATCH.
private WebClient getWebClient(String servicePath, List<Object> providers) {
WebClient client = providers != null ? WebClient.create(servicePath, providers, true)
: WebClient.create(servicePath);
client.header(AUTHORIZATION_HEADER, requestInfoBean.getAuthorizationDto().getJwtToken());
client.header(DEVICE_ID_HEADER, requestInfoBean.getAuthorizationDto().getDeviceId());
setTLSClientParameters(client);
return client;
}
private void setTLSClientParameters(WebClient client) {
Conduit conduit = WebClient.getConfig(client).getConduit();
if (conduit instanceof HTTPConduit) {
HTTPConduit httpConduit = (HTTPConduit) conduit;
TLSClientParameters tlsClientParameters = getOrCreateAndSetTLSClientParameters(httpConduit);
tlsClientParameters.setUseHttpsURLConnectionDefaultSslSocketFactory(true);
tlsClientParameters.setUseHttpsURLConnectionDefaultHostnameVerifier(false);
tlsClientParameters.setDisableCNCheck(true);
try {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore) null);
tlsClientParameters.setTrustManagers(tmf.getTrustManagers());
tlsClientParameters.setKeyManagers(new KeyManager[0]);
tlsClientParameters.setSslContext(SSLUtils.getSSLContext(tlsClientParameters));
} catch (GeneralSecurityException e) {
}
httpConduit.setTlsClientParameters(tlsClientParameters);
}
}
private TLSClientParameters getOrCreateAndSetTLSClientParameters(HTTPConduit httpConduit) {
TLSClientParameters tlsClientParameters = httpConduit.getTlsClientParameters();
if (tlsClientParameters == null) {
tlsClientParameters = new TLSClientParameters();
httpConduit.setTlsClientParameters(tlsClientParameters);
}
return tlsClientParameters;
}
И затем мы вызываем запрос PATCH следующим образом.
WebClient client = getWebClient(servicePath, providers);
WebClient.getConfig(client).getRequestContext().put(AsyncHTTPConduit.USE_ASYNC, true);
Response response = client.type(CONTENT_TYPE_HEADER).invoke("PATCH", updateProfileRqDto);
Код выдается ниже цепочки сертификатов исключение.
Caused by: java.security.cert.CertPathValidatorException: The certificate issued by CN=***, O=***, L=***, ST=***, C=** is not trusted; internal cause is:
java.security.cert.CertPathValidatorException: Certificate chaining error
at com.ibm.security.cert.BasicChecker.<init>(BasicChecker.java:111)
at com.ibm.security.cert.PKIXCertPathValidatorImpl.engineValidate(PKIXCertPathValidatorImpl.java:220)
at com.ibm.security.cert.PKIXCertPathBuilderImpl.myValidator(PKIXCertPathBuilderImpl.java:749)
at com.ibm.security.cert.PKIXCertPathBuilderImpl.buildCertPath(PKIXCertPathBuilderImpl.java:661)
at com.ibm.security.cert.PKIXCertPathBuilderImpl.buildCertPath(PKIXCertPathBuilderImpl.java:607)
at com.ibm.security.cert.PKIXCertPathBuilderImpl.buildCertPath(PKIXCertPathBuilderImpl.java:607)
at com.ibm.security.cert.PKIXCertPathBuilderImpl.engineBuild(PKIXCertPathBuilderImpl.java:368)
... 25 more
Caused by: java.security.cert.CertPathValidatorException: Certificate chaining error
at com.ibm.security.cert.CertPathUtil.findIssuer(CertPathUtil.java:316)
at com.ibm.security.cert.BasicChecker.<init>(BasicChecker.java:108)
... 31 more
Обратите внимание, что код отлично работает на сервере Tomcat 9. Также мы импортировали необходимые сертификаты (полная цепочка сертификатов) в доверенное хранилище Websphere, а также в JVM, но проблема все еще сохраняется.