WSS4J
Apache WSS4J est une implémenation de OASIS Web Services Security (WS-Security). C'est une librairie qui peut être utilisée pour signer et vérifier des messages SOAP contenant des informations WS-Security information. WSS4J utilise les projets Apache Axis and Apache XML-Security.
WSS4J implémente
- * OASIS Web Serives Security: SOAP Message Security 1.0 Standard 200401, March 2004
- * Username Token profile V1.0
- * X.509 Token Profile V1.0
Sécurité Username Token avec un CallbackHandler
Les étapes suivantes expliquent comment, une fois le client créé via axis (WSDL2Java), sécuriser une service web en utilisant un Username Token et un callback handler
Etape 1: Création d'un descripteur de déployement
Une référence à la classe callback est insérée. Elle permet d'indiquer quelle classe se charge de la récupération du mot de passe.
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
<globalConfiguration >
<requestFlow >
<handler type="java:org.apache.ws.axis.security.WSDoAllSender" >
<parameter name="action" value="UsernameToken Timestamp"/>
<parameter name="timeToLive" value="3000" />
<parameter name="user" value="wss4j"/>
<parameter name="passwordCallbackClass" value="mon.package.MonPWCallback"/>
<parameter name="passwordType" value="PasswordText"/>
<parameter name="addUTElements" value="Nonce Created" />
</handler>
</requestFlow >
</globalConfiguration >
</deployment>
Le paramètre action spécifie les différents éléments à ajouter dans le header:
| UsernameToken | Ajout d'un token userName <wsse:UsernameToken... |
| Timestamp | Ajout d'un horodateur <wsu:Timestamp... |
Le paramètre timeToLive permet de définir la durée de validité du timestamp en secondes
Le paramètre passwordType spécifie si le mot de passe est en clair (PasswordText) ou crypté (PasswordDigest)
Le paramètre addUTElements (avec s) permet de rajouter les éléments
| Nonce | <wsse:Nonce>... | Valeur aléatoire qui fait office de mesure de sécurité contre les 'replay attacks', nécessite un serveur pour stocker les nonce utilisés. |
| Created | <wsu:Created>... | Horodateur de création |
Plus d'infos sur le UsernameToken ici
Etape 2: Création de la classe de callback
package mon.package;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;
/**
* PWCallback for the Client
*/
public class MonPWCallback implements CallbackHandler {
/**
* @see javax.security.auth.callback.CallbackHandler#handle(javax.security.
* auth.callback.Callback[])
*/
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof WSPasswordCallback) {
WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
// set the password given a username
if ("wss4j".equals(pc.getIdentifer())) {
pc.setPassword("security");
}
} else {
throw new UnsupportedCallbackException(callbacks[i], "Not know Callback");
}
}
}
}