Web Services. Nel corso del'esercitazione sono utilizzati il servizio web shopping ed il relativo client sviluppati nelle precedenti esercitazioni. Eventualmente fare riferimento alla soluzione dell'esercitazione Web Service e seguire le istruzioni per il deploy e l'esecuzione per preparare l'ambiente.
Keystore.
Saranno utilizzati i keystore client.jks
e
shopping.jks
prodotti nell'
esercitazione Certificati
Obiettivo di questo esercizio è configurare il Web Service Client in modo da inviare messaggi cifrati.
Nota | |
---|---|
Per informazioni sulle possibili configurazioni del WS-Security si rimanda alla documentazione ufficiale |
Step 1. Aggiungere i parametri di accesso al keystore.
L'implementazione di WS-Security utilizzata da CXF richiede che i
parametri di accesso al keystore siano forniti tramite file di properties.
Creiamo quindi il file client.jks.properties
:
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin org.apache.ws.security.crypto.merlin.keystore.type=jks org.apache.ws.security.crypto.merlin.keystore.password=****** org.apache.ws.security.crypto.merlin.file=/home/u/user/keystore/client.jks
Step 2. Abilitare l'Encryption in output.
Fornire la configurazione del WS-Security programmaticamente
è complicato e poco intuitivo, quindi utilizziamo un approccio
simile a quello visto lato Web Service utilizzando un file di configurazione.
Aggiungiamo il file client.xml
al progetto dove viene
definito un client per il servizio configurato per la cifratura dei
messaggi in output:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <jaxws:client id="client" serviceClass="it.unipi.di.lai.shopping.Shopping" address="http://localhost:8080/webservice/services/SOAP"> <jaxws:features> <bean class="org.apache.cxf.feature.LoggingFeature" /> </jaxws:features> <jaxws:outInterceptors> <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> <constructor-arg> <map> <entry key="action" value="Encrypt" /> <entry key="encryptionUser" value="shopping" /> <entry key="encryptionPropFile" value="/home/u/user/keystore/client.jks.properties" /> </map> </constructor-arg> </bean> </jaxws:outInterceptors> </jaxws:client> </beans>
E instanziamo lo stub utilizzando il file di configurazione appena creato:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("client.xml"); Shopping port = (Shopping) context.getBean("client");
Step 3. Verificare l'abilitazione. Eseguire il client verificando che la richiesta venga prodotta con il contenuto cifrato.
Obiettivo di questo esercizio è configurare il Web Service in modo da accettare messaggi cifrati.
Implementare la Password Callback.
L'implementazione di WS-Security utilizzata da CXF
richiede che venga fornita una classe che implementi
l'interfaccia PasswordCallback
per la gestione
delle password dei certificati privati. Creiamone
una molto semplice nel progetto del Web Service:
public class PasswordCallback implements CallbackHandler { public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) { WSPasswordCallback pc = (WSPasswordCallback)callbacks[i]; String alias = pc.getIdentifier(); System.out.println("Richiesta la password per il certificato " + alias); if(alias.equals("shopping")) pc.setPassword("******"); } } }
Step 2: Aggiungere i parametri di accesso al keystore.
Oltre alla PasswordCallback per decifrare i certificati privati ai certificati
sono richiesti i parametri di accesso al Keystore. Creiamo
il file shopping.jks.properties
con il seguente contenuto:
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin org.apache.ws.security.crypto.merlin.keystore.type=jks org.apache.ws.security.crypto.merlin.keystore.password=****** org.apache.ws.security.crypto.merlin.file=/home/u/user/keystore/shopping.jks
Step 3. Abilitare l'Encryption in input.
Aprire il file di configurazione di CXF
WebContent/WEB-INF/beans.xml
e configurare la coda di input con
l'interceptor WSSecurity:
<jaxws:endpoint ....> <jaxws:inInterceptors> <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor"> <constructor-arg> <map> <entry key="action" value="Encrypt" /> <entry key="decryptionPropFile" value="/home/u/user/keystore/shopping.jks.properties" /> <entry key="passwordCallbackClass" value="il.mio.package.PasswordCallback" /> </map> </constructor-arg> </bean> </jaxws:inInterceptors> </jaxws:endpoint>
Step 4. Verificare l'abilitazione. Deployare il servizio ed eseguire nuovamente il client verificando che la richiesta venga elaborata correttamente.