Web Service Security


1. Preparazione

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

2. Esercizio: Abilitare Cifratura sul client

Obiettivo di questo esercizio è configurare il Web Service Client in modo da inviare messaggi cifrati.

[Nota] 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.

3. Esercizio: Abilitare Cifratura sul servizio

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.

Footer BGFooter BG
Tito Flagella - © 2007-2015