Запрос клиента SOAP Spring по https и через брандмауэр

Прошло некоторое время с тех пор, как я написал клиент SOAP, но я пытаюсь написать клиента, который подключает / использует внешнюю службу SOAP через https и через брандмауэр.

Я вручную вытащил wsdl и схемы и использовал функцию клиента веб-службы Eclipse для генерации кода веб-службы. В данный момент я вызываю клиентский код через запрос на получение, чтобы посмотреть, смогу ли я вообще подключиться к WS. Я могу просматривать WSDL в Chrome \ IE и использовать ReadyApi для проверки соединения вне Java и RAD / WebSphere.

@Bean
public Jaxb2Marshaller marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();     
    marshaller.setPackagesToScan("com.complianceservice.client");
    try {
        marshaller.afterPropertiesSet();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return marshaller;
}
@Bean
public VendorClient vendorClient(Jaxb2Marshaller marshaller) {
    VendorClient client = new VendorClient ();
    client.setDefaultUri("https://webservice.vendor.com/WebServices/productServices.svc?wsdl");
    client.setMarshaller(marshaller);
    client.setUnmarshaller(marshaller);
    return client;
}

Это вызовет код обслуживания клиентов ...

@GetMapping(value = "/health")
public String getHealth() throws ResponseException {
    Response response = vendorComplianceService.processHealth();
    return response!= null?"Health, OK":"Problem detected";
}

@Override
public MessageResponse processHealth() throws ResponseException {
    try {
        GetDaysUntilPasswordExpiresResponse response = vendorClient.getGetDaysUntilPasswordExpires();
        if (response != null){
            MessageResponse myResponse = new MessageResponse();
        //set something
            return myResponse;
        }
    } catch (Exception e) {
        e.printStackTrace();
        throw new ResponseException(e);
    }       
    return null;
}

public GetDaysUntilPasswordExpiresResponse getGetDaysUntilPasswordExpires( ){

    GetDaysUntilPasswordExpires requestPayload = new GetDaysUntilPasswordExpires();
    requestPayload.setContext(healthClientContext());   
    log.info("Requesting expire info for :" + clientContext.getUserID());       
    GetDaysUntilPasswordExpiresResponse response = (GetDaysUntilPasswordExpiresResponse) getWebServiceTemplate()
            .marshalSendAndReceive("https://webservice.vendor.com/WebServices/IAccount/GetDaysUntilPasswordExpires", requestPayload                     
            );
    return response;
}

Это просто приведет к тайм-ауту поиска ответа от сервера, потому что наш брандмауэр блокирует его.

Как мне указать этому клиентскому коду использовать настройки прокси для прохождения через наш брандмауэр в Java / Spring? В REST я могу указать httpclient, который использует провайдер учетных данных прокси с фабрикой сокетов ssl-соединения. Я не уверен, как это сделать с клиентом SOAP, который использует WebServiceTemplate для маршалинга, отправки и получения. Это вообще хорошая идея?

Также как я могу зарегистрировать или просмотреть фактический запрос SOAP, чтобы убедиться, что я отправляю правильный формат?

Для тех, кто знаком с WebSphere, как я могу обеспечить правильную установку и использование удаленных сертификатов?

Это «традиционный» WebSphere или WebSphere Liberty?

dbreaux 26.10.2018 22:25

Традиционный БЫЛ

iowatiger08 30.10.2018 13:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
2 064
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В последней части вашего вопроса вы обычно выбираете CellDefaultTrustStore и Retrieve from port, указывая удаленный сервер и порт:

https://www.ibm.com/support/knowledgecenter/en/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/usec_sslretrievesignercert.html

(У меня нет ответа на вопрос о доверенности.)

У меня было несколько, но когда я увидел и использовал хранилище доверенных сертификатов «По умолчанию», указанное в разделе Безопасность> SSL-сертификат и управление ключами> Конфигурация SSL> Настройки по умолчанию, это было правильное хранилище ключей для импорта корневого ЦС.

iowatiger08 01.11.2018 17:36
Ответ принят как подходящий

Комбинация @dbreaux помогает добавить CA в WAS, и следующее решает проблему.

В AppConfig я добавил этот bean ...

@Bean
public WebServiceTemplate webServiceTemplate(){
    WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
    MessageFactory msgFactory = null;
    try {
        msgFactory = MessageFactory.newInstance(SOAPConstants.DEFAULT_SOAP_PROTOCOL);
    } catch (SOAPException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    SaajSoapMessageFactory newSoapMessageFactory = new SaajSoapMessageFactory(msgFactory);
    webServiceTemplate.setMessageFactory(newSoapMessageFactory);
    webServiceTemplate.setMarshaller(marshaller());
    webServiceTemplate.setUnmarshaller(marshaller());
    return webServiceTemplate; 
}

//and then wired into the client component and set system properties for https proxy

public GetDaysUntilPasswordExpiresResponse getGetDaysUntilPasswordExpires(  ){
    System.getProperties().put("https.proxyHost", HTTPS_PROXY_HOST );  
    System.getProperties().put("https.proxyPort", HTTPS_PROXY_PORT);

    System.getProperties().put("https.proxyUser", HTTPS_PROXY_USER );  
    System.getProperties().put("https.proxyPassword", HTTPS_PROXY_PASSWORD);
    GetDaysUntilPasswordExpires requestPayload = new GetDaysUntilPasswordExpires();
    requestPayload.setContext( healthClientContext());

    log.info("Requesting expire info for :" + healthClientContext.getUserID()); 
    GetDaysUntilPasswordExpiresResponse response = (GetDaysUntilPasswordExpiresResponse) webServiceTemplate 
            .marshalSendAndReceive(
                    VENDOR_WS_URL+"/Account"
                    ,requestPayload 
                    ,new SoapActionCallback(VENDOR_WS_NAMESPACE_URL+"/IAccount/GetDaysUntilPasswordExpires"){
                        @Override
                        public void doWithMessage(WebServiceMessage message)
                                throws IOException {
                            SaajSoapMessage soapMessage = (SaajSoapMessage) message;
                            soapMessage.setSoapAction(VENDOR_WS_NAMESPACE_URL+"/IAccount/GetDaysUntilPasswordExpires");   
                        }
                    }
            );
    return response;
}

Другие вопросы по теме