Прошло некоторое время с тех пор, как я написал клиент 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, как я могу обеспечить правильную установку и использование удаленных сертификатов?
Традиционный БЫЛ




В последней части вашего вопроса вы обычно выбираете CellDefaultTrustStore и Retrieve from port, указывая удаленный сервер и порт:
(У меня нет ответа на вопрос о доверенности.)
У меня было несколько, но когда я увидел и использовал хранилище доверенных сертификатов «По умолчанию», указанное в разделе Безопасность> SSL-сертификат и управление ключами> Конфигурация SSL> Настройки по умолчанию, это было правильное хранилище ключей для импорта корневого ЦС.
Комбинация @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;
}
Это «традиционный» WebSphere или WebSphere Liberty?