## Guida all'implementazione della WS-Security con CXF

### Introduzione

Con Servicegen è possibile definire la WS-Security di un servizio applicativo CXF modellando le caratteristiche specifiche di sicurezza (WSSecuritySpec).

Per configurare un servizio al fine di rendere sicuri i suoi messaggi è necessario modellare un WSEndpoint e quindi definire una sequenza di intercettori (WSEndpointChannel) che il messaggio dovrà attraversare in ingresso (--> IN WSEndpointChannel) e\o uscita (<-- OUT WSEndpointChannel) per securizzare il messaggio.

Ogni WSEndpointChannel contiene la catena di specifiche di sicurezza (WSSecuritySpec) da applicare al canale, quelle possibili sono : autenticazione (WS UsernameToken), integrità(WS Encryption), TimeStamp (WS Timestamp) e confidenzialità(WS Signature).

Esempio di modellazione

### Configurazione WSEndpointChannel

#### Descrizione WSSecuritySpec

WSSecuritySpec | Descrizione | Definzione per WSEndpointChannel | Codice Generato
UsernameToken | Abilita l'inserimento di un UsernameToken per l'autenticazione in chiaro |
-->IN WSEndpointChannel | -->OUT WSEndpointChannel
Specifica che ci si aspetta nell' header del messaggio SOAP un UsernameToken con password inviata in chiaro | Specifica che all' header del messaggio dovrà essere applicato un UsernameToken e una password
| Nella classe di implementazione del CallbackHandler creata per il WSEndpointChanel viene generata la logica per la gestione della password. Se siamo nel canale d' ingresso nel impl del CallbackHandler (InInterceptorCallback#WSEndpoint.code#) viene generato il metodo setPassordUsernameToken() con una regione protetta al suo interno per permettere l'inserimento della password Se siamo nel canale di uscita nel impl del CallbackHandler (OutInterceptorCallback#WSEndpoint.code#) viene generato il metodo validatePassordUsernameToken() per il controllo dello user e della passord.
Timestamp | Permette di gestire la temporalità dei messaggi |
-->IN WSEndpointChannel | -->OUT WSEndpointChannel
Specifica che ci si aspetta un Timestamp nel messaggio in ingresso | Specifica che deve essere applicato un Timestamp nel messaggio di uscita
Signature | Abilita la firma del messaggio. |
-->IN WSEndpointChannel | -->OUT WSEndpointChannel
Specifica che ci si aspetta un messaggio firmato e nel file di confugurazione avremo definite le properties per verificare la firma del messaggio | Specifica che il body del messaggio inviato dovrà essere firmato con la chiave privata definita tra i file di configurazione
| Nella classe di implementazione del CallbackHandler creata per il WSEndpointChanel di uscita (OutInterceptorCallback#WSEndpoint.code#) viene generata la logica per la gestione delle password di lettura dei certificati (setPasswordSignature) . Il generatore produrrà i file di properties per poter accedere ai keystore\trustore (#codiceServizio##WSEndpoint.code#.ks.properties e/o #codiceServizio##WSEndpoint.code#.ts.properties ). Per la definizione delle seguenti property : org.apache.ws.security.crypto.merlin.keystore.user --> alias chiave privata org.apache.ws.security.crypto.merlin.keystore.password --> indica la password per accedere al keystore/trustore org.apache.ws.security.crypto.merlin.file --> indica il path del keystore/trustore E' necessario valorizzare le seguenti variabili d'ambiente: #codiceServizio##WSEndpoint.code#.user #codiceServizio##WSEndpoint.code#.ks.password #codiceServizio##WSEndpoint.code#.ks.file
Encryption | Abilita la cifratura del messaggio. |
-->IN WSEndpointChannel | -->OUT WSEndpointChannel
Specifica che ci si aspetta un messaggio crittografato e nel file di confugurazione avremo definite le properties per decryptare il messaggio | Specifica che il body del messaggio inviato dovrà essere cryptato con la chiave pubblica definita tra i file di configurazione
| Nella classe di implementazione del CallbackHandler creata per il WSEndpointChanel di ingresso (InInterceptorCallback#WSEndpoint.code#) viene generata la logica per la gestione delle password di lettura dei certificati (setPassordDecrypt). Il generatore produrrà i file di properties per poter accedere ai keystore\trustore (#codiceServizio##WSEndpoint.code#.ks.properties e/o #codiceServizio##WSEndpoint.code#.ts.properties ). Per la definizione delle seguenti property : org.apache.ws.security.crypto.merlin.keystore.user --> alias chiave privata org.apache.ws.security.crypto.merlin.keystore.password --> indica la password per accedere al keystore/trustore org.apache.ws.security.crypto.merlin.file --> indica il path del keystore/trustore E' necessario valorizzare le seguenti variabili d'ambiente: #codiceServizio##WSEndpoint.code#.userEncrypt #codiceServizio##WSEndpoint.code#.ks.password #codiceServizio##WSEndpoint.code#.ks.file