Spring ws è un pacchetto messo a disposizione da Spring per gestire agevolmente la comunicazione tra servizi SOAP. La libreria consente di configurare agevolmente un server soap che riceve chiamate nel rispetto di uno schema definito dall’utente. Per maggiori informazioni rimando all’ottimo tutorial realizzato dai ragazzi di spring e che trovate qui
Inoltre la libreria consente di configurare agevolmente un client per poter invocare dei servizi esposti su un altro server e sulla configurazione base rimando sempre al tutorial di spring che trovate qui.
In questo articolo approfondiamo come configurare il client che gira all’interno di una rete con proxy e che richiede lo scambio dei certificati con il server su cui sono esposti i servizi soa.
Il nostro client si trova in una rete con 2 livelli di sicurezza: un proxy che regola il traffico verso l’esterno della nostra rete e un server che accetta chiamate crittografate con un certificato associato.
Per fare questo dobbiamo configurare il messagesender presente nella classe WebServiceTemplate con una istanza della classe org.springframework.ws.transport.http.HttpComponentsMessageSender che utilizza la classe Apache HttpClient per l’invio di Post.
1 2 3 |
HttpComponentsMessageSender httpComponentsMessageSender = httpComponentsMessageSender(); httpComponentsMessageSender.setHttpClient(httpClient()); client.setMessageSender(httpComponentsMessageSender); |
Nella classe client sto settando il message sender tramite un metodo seguente in configuro i tempi di timeout e a questo passo il client httoClient dove effettivamente configuro il proxy e il certificato
1 2 3 4 5 6 7 |
@Bean public HttpComponentsMessageSender httpComponentsMessageSender() { HttpComponentsMessageSender sender = new HttpComponentsMessageSender(); sender.setReadTimeout(3000); sender.setConnectionTimeout(3000); return sender; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
@Bean public HttpClient httpClient() throws Exception { KeyStore ks = KeyStore.getInstance("JKS"); ks.load(keyStore.getInputStream(), keyStorePassword.toCharArray()); try { keyStore.getInputStream().close(); } catch (IOException e) { e.printStackTrace(); } KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManagerFactory.init(ks, keyStorePassword.toCharArray()); KeyStore ts = KeyStore.getInstance("JKS"); ts.load(trustStore.getInputStream(), trustStorePassword.toCharArray()); try { trustStore.getInputStream().close(); } catch(IOException e) { e.printStackTrace(); } TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(ts); SSLContext sslContext = SSLContexts.custom() .loadKeyMaterial(ks, keyStorePassword.toCharArray()) .loadTrustMaterial(ts, null) .build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); HttpClientBuilder clientBuilder = HttpClients.custom().setSSLSocketFactory(sslsf). addInterceptorFirst(new HttpComponentsMessageSender.RemoveSoapHeadersInterceptor()); HttpHost proxy = new HttpHost(proxyHost, proxyPort); clientBuilder.setProxy(proxy); HttpClient httpClient = clientBuilder.build(); return httpClient; } |
Definisco il contesto SSL fornendo il keystore e il truststore. Definisco il proxy fornendo host e porta e infine creo il client usando la classe HttpClientBuilder.
Alla prossima