Websphere - проблема с Spring Integration SSL - PullRequest
0 голосов
/ 18 февраля 2019

Наше приложение Spring Integration работает в Websphere.Это клиент для внешней службы SSL.

Я импортировал сертификат, используя Retrive из порта [в хранилище доверия по умолчанию], предоставив хост и порт 443.Включена трассировка в WebSphere, и похоже, что он ищет файл cacert, а не trust.p12.

[18-2-19 13:44:59:154 CET] 00000063 SystemOut     O 2019-02-18 13:44:59.153  INFO 30426 --- [ver.startup : 0] pertySourcedRequestMappingHandlerMapping : Mapped URL path [/v2/api-docs] onto method [public org.springframework.http.ResponseEntity<springfox.documentation.spring.web.json.Json> springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation(java.lang.String,javax.servlet.http.HttpServletRequest)]
[18-2-19 13:44:59:826 CET] 00000063 SystemOut     O keyStore is: /srv/opt/IBM/WebSphere/AppServer/java/8.0/jre/lib/security/cacerts

Код:

public class PreemptiveMessageSender extends HttpComponentsMessageSender {

    @Autowired
    private Environment env; 

    private String host;
    private String userId;
    private String password;

    public PreemptiveMessageSender() {
        super();
    }

    public PreemptiveMessageSender(HttpClient httpClient) {
        super(httpClient);
    }

    @Override
    protected HttpContext createContext(URI uri) {

        HttpHost targetHost = new HttpHost(host, 443, "https");

        String decryptedPassword = getDecryptedPassword();

         CredentialsProvider credsProvider = new BasicCredentialsProvider();
         credsProvider.setCredentials(AuthScope.ANY, 
                    new UsernamePasswordCredentials(userId, decryptedPassword));

         AuthCache authCache = new BasicAuthCache();
         authCache.put(targetHost, new BasicScheme());

         // Add AuthCache to the execution context
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
         context.setAuthCache(authCache);

         return context;        
    }

    private String getDecryptedPassword() {
        BasicTextEncryptor textEncrypt = new BasicTextEncryptor();

        textEncrypt.setPassword(env.getProperty("KEY_PASSWORD"));
        return textEncrypt.decrypt(password);       
    }

    @Override
    public WebServiceConnection createConnection(URI uri) throws IOException {

        HttpPost httpPost = new HttpPost(uri);
        if (isAcceptGzipEncoding()) {
            httpPost.addHeader(HttpTransportConstants.HEADER_ACCEPT_ENCODING,
                    HttpTransportConstants.CONTENT_ENCODING_GZIP);
        }
        HttpContext httpContext = createContext(uri);
        return new CustomHttpComponentsConnection(getHttpClient(), httpPost, httpContext);
    }

    ... 
}

Ошибка :

«исключение»: «org.springframework.ws.client.WebServiceIOException», «message»: «Ошибка ввода-вывода: com.ibm.jsse2.util.h: путь PKIXсбой здания: java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl не удалось создать действительный CertPath; внутренняя причина: \ n \ tjava.security.cert.CertPathValidatorException: сертификат, выданный CN = ODC Test Root CA - G1, O =Тест ODC, C = TU не является доверенным, внутренняя причина: \ n \ tjava.security.cert.CertPathValidatorException: ошибка цепочки сертификата; вложенное исключение - javax.net.ssl.SSLHandshakeException: com.ibm.jsse2.util.h:Ошибка построения пути PKIX: java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl не удалось создать действительный CertPath; внутренняя причина: \ n \ tjava.security.cert.CertPathValidatorException: сертификат, выданный CN = ODC Test Root CA - G1, O = ODC Test, C = TU не является доверенным;внутренняя причина: \ n \ tjava.security.cert.CertPathValidatorException: ошибка цепочки сертификата ",

Вопрос : связана ли эта проблема с интеграцией Spring с использованием java cacert? Какзаставить его использовать хранилище доверия WebSphere?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

https://developer.ibm.com/answers/questions/394270/im-using-an-apache-httpclient-to-make-an-outbound/

HttpClient theClient = HttpClientBuilder.create (). UseSystemProperties (). AddInterceptorFirst (новый RemoveSoapHeadersInterceptor ()). Build ();

private static class RemoveSoapHeadersInterceptor implements HttpRequestInterceptor {
        @Override
        public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
            if (request instanceof HttpEntityEnclosingRequest) {
                if (request.containsHeader(HTTP.TRANSFER_ENCODING)) {
                    request.removeHeaders(HTTP.TRANSFER_ENCODING);
                }
                if (request.containsHeader(HTTP.CONTENT_LEN)) {
                    request.removeHeaders(HTTP.CONTENT_LEN);
                }
            }
        }   
    }
0 голосов
/ 18 февраля 2019

Начну с того, что ничего не знаю о весне.Но учитывая поведение, о котором вы говорите, должно быть создание собственного экземпляра SSLContext.Это заставит его пройти настройки WebSphere SSL.Он должен делать что-то вроде SSLContext.getInstance (), чтобы создать свой собственный экземпляр, или он может делать что-то вроде SSLContext.getDefault (), который возвращает вам SSLContext JDK по умолчанию.И то и другое не даст вам WebSphere SSLContext.

...