Получение ошибки цепочки сертификатов в WAS 8.5 с Apache CXF WebClient - PullRequest
1 голос
/ 30 марта 2020

Мы получаем «Ошибка цепочки сертификатов» при использовании 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, но проблема все еще сохраняется.

...