Demande de jetons SAML sender-vouches à un STS externe à l'aide des API WSS avec la protection au niveau des messages

Vous pouvez demander des jetons SAML avec la méthode de confirmation des sujets sender-vouches à un STS (Security Token Service) externe. Une fois que vous avez obtenu les jetons SAML sender-vouches, vous pouvez les envoyer dans des messages de demande de services Web à l'aide du modèle de programmation JAX-WS (Java™ API for XML-Based Web Services) et des API WSS (Web Services Security) avec protection au niveau des messages.

Avant de commencer

On considère ici que vous connaissez le modèle de programmation JAX-WS, les API WSS, les concepts de SAML, la protection du transport SSL, le jeton de sécurité X.509 et l'utilisation des ensembles de règles pour configurer et administrer les paramètres des services Web.

Pourquoi et quand exécuter cette tâche

Vous pouvez demander à un STS externe un jeton SAML avec la méthode de confirmation des sujets sender-vouches, puis l'envoyer dans les messages de demande de services Web à partir d'un client de services Web à l'aide d'API WSS avec protection au niveau des messages.

Ce produit ne fournit pas d'ensemble de règles par défaut nécessitant des jetons SAML avec la méthode de confirmation du sujet sender-vouches. Consultez la rubrique relative à la configuration des clients et des fournisseurs pour le jeton SAML sender-vouches (envoyeur garant) pour en savoir plus sur la façon de créer des règles de sécurité de Services Web impliquant des jetons SAML avec la confirmation du sujet de type sender-vouches, et sur la façon de créer une configuration de liaison personnalisée. Vous devez associer les règles et la liaison au fournisseur de services Web. Pour le modèle de code décrit dans cette tâche, on considère que les règles du fournisseur de services web requièrent la signature numérique des jetons SAML et des corps de message à l'aide d'un jeton de sécurité X.509.

L'application client de services web utilisée dans cette tâche est une version modifiée du code client contenu dans l'application modèle JaxWSServicesSamples disponible pour le téléchargement. Des exemples de code du modèle sont décrits dans la procédure et un modèle de client de services Web prêt à l'emploi est fourni.

Procédure

  1. Identifiez et obtenez le client de services Web que vous souhaitez utiliser pour appeler un fournisseur de services Web.

    Utilisez ce client pour programmer l'insertion des jetons SAML dans des messages de demande SOAP à l'aide des API WSS.

    Le client de services Web utilisé dans cette procédure est une version modifiée du code client contenu dans l'exemple d'application de services Web JaxWSServicesSamples.

    Pour obtenir le modèle de client de services Web et le modifier en ajoutant les API de Services de sécurité (WSS), afin de programmer la transmission de jetons SAML sender-vouches dans les messages de demande SOAP, procédez comme suit :

    1. Téléchargez l'exemple d'application JaxWSServicesSamples. Le modèle d'application JaxWSServicesSamples n'est pas installé par défaut.
    2. Obtenez le code client JaxWSServicesSamples.

      Pour les besoins de l'exemple, cette procédure utilise une version modifiée du client léger Echo compris dans le modèle JaxWSServicesSamples. L'exemple de fichier client fin Echo de services Web, SampleClient.java, est situé dans le répertoire src\SampleClientSei\src\com\ibm\was\wssample\sei\cli. L'exemple de fichier de classe est inclus au fichier WSSampleClientSei.jar.

      L'application d'entreprise JaxWSServicesSamples.ear et la prise en charge des fichiers d'archive Java (JAR) sont situés dans le répertoire installableApps dans l'exemple d'application JaxWSServicesSamples.

    3. Déployez le fichier JaxWSServicesSamples.ear dans le serveur d'application. Une fois le fichier JaxWSServicesSamples.ear déployé, vous êtes prêt à tester le modèle de code de client de services Web avec le modèle d'application.

    Au lieu d'utiliser le modèle de client de services web, vous pouvez choisir d'intégrer à votre propre application client de services Web les fragments de code destinés à programmer la transmission des jetons SAML dans les messages de demande SOAP à l'aide des API WSS. L'exemple pris dans cette procédure utilise un client léger de services Web JAX-WS ; il est cependant possible d'utiliser un client géré.

  2. Spécifiez l'utilisation de la protection des messages au niveau des messages. Utilisez la propriété JVM suivante pour spécifier l'utilisation de SSL pour protéger la demande de jeton SAML avec le STS :
    -Dcom.ibm.SSL.ConfigURL=file:racine_profil\properties\ssl.client.props
    A la place, vous pouvez également définir le fichier de configuration SSL en définissant une propriété système Java dans le modèle de code client, par exemple :
    System.setProperty("com.ibm.SSL.ConfigURL", "file:racine_profil/properties/ssl.client.props");
  3. Ajoutez le fichier JAR du client léger JAX-WS au chemin d'accès aux classes. Ajoutez le fichier racine_serveur_app/runtimes/com.ibm.jaxws.thinclient_8.5.0.jar au chemin d'accès aux classes. Pour plus d'informations sur l'ajout de ce fichier JAR au chemin d'accès aux classes, consultez la rubrique relative au test des clients compatibles avec les services Web.
  4. Demandez le jeton SAML à un STS externe. Le fragment de code suivant montre comment demander le jeton SAML sender-vouches et suppose qu'un STS externe est configuré pour accepter un jeton Username et émettre un jeton SAML 2.0 à l'aide de sender-vouches après validation :
    //Demande du jeton SAML à un STS externe
    WSSFactory factory = WSSFactory.getInstance();
    String STS_URI  = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
    String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
    WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
    WSSConsumingContext concont1 = factory.newWSSConsumingContext(); 
    HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
    cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
    cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
    cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
    cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
    cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML11_VALUE_TYPE);
    cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
    
    SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);
    
    // Ajout de UNT à la demande sécurisée
    UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
    SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
    
    gencont1.add(ut);
    
    cbHandler1.setWSSConsumingContextForTrustClient(concont1);
    cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
    SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");
    
    System.out.println("SAMLToken id = " + samlToken.getId());
    1. Utilisez la méthode WSSFactory newSecurityToken pour définir la façon de demander le jeton SAML à un STS externe.
      Indiquez la méthode suivante pour créer un jeton SAML :
      WSSFactory  newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml")
      La demande d'un jeton SAML requiert le droit d'accès Java wssapi.SAMLTokenFactory.newSAMLToken. Utilisez l'outil Policy Tool pour ajouter l'instruction de règle suivante au fichier de règles de sécurité Java ou au fichier du client d'application was.policy :
      permission java.security.SecurityPermission "wssapi.SAMLTokenFactory.newSAMLToken"

      Le paramètre SAMLToken.class définit le type de jeton à créer.

      L'objet callbackHandler contient les paramètres qui définissent les caractéristiques du jeton SAML que vous demandez et les autres paramètres requis pour atteindre le STS et obtenir le jeton SAML. L'objet SAMLGenerateCallbackHandler spécifie les paramètres de configuration décrits dans le tableau ci-dessous :
      Tableau 1. Propriétés de SAMLGenerateCallbackHandler. Ce tableau décrit les paramètres de configuration de l'objet SAMLGenerateCallbackHandler utilisant la méthode de confirmation du sujet sender-vouches.
      Propriété Description Obligatoire
      SamlConstants.CONFIRMATION_METHOD Définit l'utilisation de la méthode de confirmation sender-vouches. Oui
      SamlConstants.TOKEN_TYPE

      Indique le type de jeton.

      Lorsqu'un client de services Web est associé à des ensembles de règles, cette propriété n'est pas utilisée par l'environnement d'exécution de sécurité des Services Web.

      Spécifiez le type de valeur du jeton à l'aide de l'attribut valueType de la configuration de liaison du générateur de jetons.

      L'exemple pris dans cette procédure utilise un jeton SAML 1.1 ; il est cependant possible d'utiliser la valeur WSSConstants.SAML.SAML20_VALUE_TYPE.

      Oui
      SamlConstants.STS_ADDRESS

      Indique l'adresse du service de jeton de sécurité (STS).

      Pour l'exemple utilisé dans cette rubrique de tâche, la valeur de cette propriété est https afin de spécifier l'utilisation de SSL pour protéger la demande de jeton SAML.

      Vous devez définir la propriété -Dcom.ibm.SSL.ConfigURL afin d'activer l'utilisation de SSL pour protéger la demande de jeton SAML avec le STS.

      Oui
      SamlConstants.SAML_APPLIES_TO Indique l'adresse du STS cible pour laquelle vous souhaitez utiliser le jeton SAML. Non
      SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST Indique si le système doit demander au STS un jeton unique imbriqué dans un élément RequestSecurityToken (RST) ou plusieurs jetons d'une collection d'éléments RST imbriqués dans un seul élément RequestSecurityTokenCollection (RSTC).

      Le comportement par défaut consiste à demander un jeton unique imbriqué dans un élément RequestSecurityToken (RST) au STS.

      Si vous spécifiez la valeur true pour cette propriété, plusieurs jetons d'une collection d'éléments RST imbriqués dans un seul élément RequestSecurityTokenCollection (RSTC) sont demandés au STS.

      Non
      SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE Spécifie l'espace de nom WS-Trust inclus dans la demande WS-Trust.

      La valeur par défaut est WSTrust 1.3.

      Non

      Une instance WSSGenerationContext et une instance WSSConsumingContext sont également définies dans l'objet SAMLGenerateCallbackHandler. L'instance WSSGenerationContext doit contenir un objet UNTGenerateCallbackHandler avec les informations permettant de créer l'élément UsernameToken à envoyer au STS.

      Le paramètre system.wss.generate.saml définit le module de connexion JAAS (Java Authentication and Authorization Service) utilisé pour créer le jeton SAML. Vous devez spécifier une propriété JVM pour définir un fichier de configuration JAAS contenant la configuration requise pour la connexion JAAS, par exemple :
      -Djava.security.auth.login.config=racine_profil/properties/wsjaas_client.conf 
      A la place, vous pouvez également spécifier un fichier de configuration de la connexion JAAS en définissant une propriété système Java dans le modèle de code client, par exemple :
      System.setProperty("java.security.auth.login.config", "racine_profil/properties/wsjaas_client.conf ");
    2. Obtenez l'identificateur du jeton SAML créé.
      Utilisez l'instruction suivante comme une simple test pour le jeton SAML que vous avez créé :
      System.out.println("SAMLToken id = " + samlToken.getId())
  5. Ajoutez le jeton SAML à l'en-tête de sécurité SOAP des messages de demande de services web.
    1. Initialisez le client de services Web. L'exemple de code suivant illustre ces actions :
      // Initialiser le client de services Web
      EchoService12PortProxy echo = new EchoService12PortProxy();
      echo._getDescriptor().setEndpoint(endpointURL);
      
      // Configurer les propriétés SOAPAction
      BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
      Map<String, Object> requestContext = bp.getRequestContext();
      requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
      requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY,	Boolean.TRUE);
      requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");
      			
      // Initialiser WSSGenerationContext
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      gencont.add(samlToken);	
    2. Initialisez WSSGenerationContext. Le fragment de code ci-dessous illustre l'utilisation de l'objet gencont.object de type WSSGenerationContext pour initialiser un contexte de génération et vous permettre d'insérer SAMLToken dans un message de demande de services Web :
      // Initialiser WSSGenerationContext
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      gencont.add(samlToken);	
      Spécifiquement, l'appel de la méthode gencont.add(samlToken) définit l'insertion du jeton SAML dans un message de demande. Pour cette opération, le code client doit disposer du droit d'accès Java 2 suivant :
       permission javax.security.auth.AuthPermission "modifyPrivateCredentials"
  6. Ajoutez un jeton X.509 pour la protection des messages à l'aide de l'API de sécurité des services Web.
    Ce modèle de code utilise le fichier de clés dsig-sender.ks et le modèle de clé SOAPRequester. N'utilisez pas le modèle clé dans un environnement de production. Le fragment de code suivant illustre l'ajout d'un jeton X.509 pour la protection des messages :
    // Ajouter un jeton X.509 pour la protection des messages
        X509GenerateCallbackHandler x509callbackHandler = new X509GenerateCallbackHandler(
            	null,
            	"racine_profil/etc/ws-security/samples/dsig-sender.ks", 
            	"JKS", 
            	"client".toCharArray(), 
            	"soaprequester", 
            	"client".toCharArray(), 
            	"CN=SOAPRequester, OU=TRL, O=IBM, ST=Kanagawa, C=JP", null);	
    
       SecurityToken x509 = factory.newSecurityToken(X509Token.class,
       x509callbackHandler, "system.wss.generate.x509");
    
       WSSSignature sig = factory.newWSSSignature(x509);
       sig.setSignatureMethod(WSSSignature.RSA_SHA1);
                    	
       WSSSignPart sigPart = factory.newWSSSignPart();
       sigPart.setSignPart(samlToken);
       sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
       sig.addSignPart(sigPart);                	
       sig.addSignPart(WSSSignature.BODY);
    1. Créez un objet WSSSignature avec le jeton X509. La ligne de code ci-dessous crée un objet WSSSignature avec le jeton X509 :
      WSSSignature sig = factory.newWSSSignature(x509);
    2. Ajoutez la portion signée à utiliser pour la protection des messages. La ligne de code qui suit définit l'ajout de WSSSignature.BODY comme portion signée :
      sig.addSignPart(WSSSignature.BODY);
    3. Ajoutez l'élément d'horodatage dans l'en-tête de sécurité des messages SOAP. Les ensembles de règles SAML20 SenderVouches WSHTTPS et SAML11 SenderVouches WSHTTPS requièrent que l'en-tête de sécurité SOAP des messages de demande de services Web et des messages de réponse contiennent un élément d'horodatage. Dans le fragment de code qui suit, l'appel de méthode factory.newWSSTimestamp() génère l'horodatage, et l'appel de méthode gencont.add(timestamp) ajoute l'heure et la date dans le message de demande :
      // Ajouter l'horodatage
      WSSTimestamp timestamp = factory.newWSSTimestamp();
         gencont.add(timestamp);
      sig.addSignPart(WSSSignature.TIMESTAMP);
                  
      gencont.add(sig);
              	
      			
      WSSConsumingContext concont = factory.newWSSConsumingContext();
    4. Configurez la signature du jeton SAML à l'aide de l'algorithme de transformation STR-Transform.
      Un objet WSSSignPart distinct et nécessaire pour définir l'algorithme de transformation de SecurityTokenReference représenté par l'attribut WSSSignPart.TRANSFORM_STRT10. Un jeton SAML ne peut pas être signé numériquement de façon directe. Cet attribut permet à l'environnement d'exécution de sécurité des Services Web de générer un élément SecurityTokenReference pour référencer SAMLToken et pour signer de façon numérique le jeton SAML à l'aide de la transformation SecurityTokenReference. La ligne de code suivante spécifie l'utilisation de l'attribut WSSSignPart.TRANSFORM_STRT10 :
      WSSSignPart sigPart = factory.newWSSSignPart();
      sigPart.setSignPart(samlToken);
      sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
    5. Associez l'objet WSSGenerationContext à l'objet RequestContext des services Web. L'objet WSSGenerationContext contient désormais toutes les informations de sécurité nécessaires au formatage d'un message de demande. L'appel de méthode gencont.process(requestContext)associe l'objet WSSGenerationContext à l'objet RequestContext des services Web pour permettre à l'environnement d'exécution de sécurité des Services de mettre en forme l'en-tête de sécurité SOAP requis, par exemple :
      // Associe l'objet WSSGenerationContext à l'objet de services Web RequestContext. 
      gencont.process(requestContext);
  7. Utilisez le jeton X.509 pour valider la signature numérique et l'intégrité du message de réponse. Si les règles du fournisseur requièrent la signature numérique du message de réponse, vous devez initialiser le jeton X.509.
    1. Un objet X509ConsumeCallbackHandler est initialisé avec le fichier de clés certifiées dsig-receiver.ks, ainsi qu'un objet de chemin de certificat pour valider la signature numérique du fournisseur. La ligne de code qui suit sert à initialiser l'objet X509ConsumeCallbackHandler :
      X509ConsumeCallbackHandler callbackHandlerVer = new X509ConsumeCallbackHandler( 
       "racine_profil/etc/ws-security/samples/dsig-receiver.ks",
                "JKS",
                 "server".toCharArray(),
                  certList,
                        java.security.Security.getProvider("IBMCertPath"));
    2. Un objet WSSVerification est créé et le corps du message est ajouté à l'objet de vérification, pour que l'environnement d'exécution de sécurité des Services Web valide la signature numérique.
      La ligne de code qui suit sert à initialiser l'objet WSSVerification :
      WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandlerVer);
      L'objet WSSConsumingContext contient désormais toutes les informations de sécurité nécessaires au formatage d'un message de demande. L'appel de méthode concont.process(requestContext) associe l'objet WSSConsumingContext à la méthode de la réponse, par exemple :
      // Associe l'objet WSSConsumingContext à l'objet de services Web RequestContext. 
      concont.process(requestContext);

Résultats

Vous avez demandé un jeton SAML avec la méthode de confirmation sender-vouches à un STS externe. Une fois que le jeton obtenu, vous l'avez envoyé avec des messages de demande de services Web à l'aide de la protection au niveau des messages du modèle de programmation JAX-WS et des API WSS.

Exemple

Le modèle de code qui suit est une application de client de services Web prête à l'emploi qui illustre la manière de demander un jeton SAML à un STS externe et de l'envoyer dans les messages de demande de services Web avec la protection au niveau des messages. Ce modèle de code illustre les étapes de la procédure décrite ci-dessus.

/**
 * Le code source qui suit est un exemple de code créé par IBM Corporation.  
 * Ce code exemple vous est fourni aux seules fins de vous aider  
 * dans l'utilisation de la technologie.  Ce code est livré  en l'état sans aucune garantie 
 * d'aucune sorte.  IBM ne sera en aucun cas responsable de tout dommage résultant de l'utilisation de 
 * cet exemple ce code, même si IBM a été informé de la possibilité de tels dommages.
 */
package com.ibm.was.wssample.sei.cli;

import com.ibm.was.wssample.sei.echo.EchoService12PortProxy;
import com.ibm.was.wssample.sei.echo.EchoStringInput;
import com.ibm.websphere.wssecurity.callbackhandler.SAMLGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.callbackhandler.UNTGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
import com.ibm.websphere.wssecurity.wssapi.WSSConsumingContext;
import com.ibm.websphere.wssecurity.wssapi.WSSFactory;
import com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext;
import com.ibm.websphere.wssecurity.wssapi.WSSTimestamp;
import com.ibm.websphere.wssecurity.wssapi.token.SAMLToken;
import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
import com.ibm.websphere.wssecurity.callbackhandler.X509ConsumeCallbackHandler;
import com.ibm.websphere.wssecurity.callbackhandler.X509GenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.WSSException;
import com.ibm.websphere.wssecurity.wssapi.signature.WSSSignPart;
import com.ibm.websphere.wssecurity.wssapi.signature.WSSSignature;
import com.ibm.websphere.wssecurity.wssapi.verification.WSSVerification;
import com.ibm.websphere.wssecurity.wssapi.token.X509Token;
import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants;
import com.ibm.wsspi.wssecurity.saml.config.SamlConstants;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.cert.CertStore;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.CollectionCertStoreParameters;
import java.security.cert.X509Certificate;
import java.util.HashSet;
import java.util.Set;
import java.util.HashMap;
import java.util.Map;

import javax.xml.ws.BindingProvider;

public class SampleSamlSVClient {
	private String urlHost = "localhost";
	private String urlPort = "9080";
	private static final String CONTEXT_BASE = "/WSSampleSei/";
	private static final String ECHO_CONTEXT12 = CONTEXT_BASE+"EchoService12";	
	private String message = "HELLO";
	private String uriString = "http://" + urlHost + ":" + urlPort;
	private String endpointURL = uriString + ECHO_CONTEXT12;
	private String input = message;

	/**
	 * main()
	 * 
	 * voir printusage() pour les arguments de ligne de commande
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		SampleSamlSVClient sample = new SampleSamlSVClient();
		sample.CallService();
	}

	/**
	 * Les paramètres CallService ont déjà été lus. Appelez les classes de proxy de service. 
	 * 
	 */
	void CallService() {
		String response = "ERROR!:";
		try {
			    System.setProperty("com.ibm.SSL.ConfigURL", "racine_profil/properties/ssl.client.props");
			    System.setProperty("java.security.auth.login.config", "racine_profil/properties/wsjaas.conf");
			

//Demande du jeton SAML à un STS externe
WSSFactory factory = WSSFactory.getInstance();
String STS_URI  = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
WSSConsumingContext concont1 = factory.newWSSConsumingContext(); 
HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML11_VALUE_TYPE);
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");

SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);

// Ajout de UNT à la demande sécurisée
UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);

gencont1.add(ut);

cbHandler1.setWSSConsumingContextForTrustClient(concont1);
cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");

System.out.println("SAMLToken id = " + samlToken.getId());                        
			
	        // Initialiser le client de services Web. 
			EchoService12PortProxy echo = new EchoService12PortProxy();
			echo._getDescriptor().setEndpoint(endpointURL);

			// Configurer les propriétés SOAPAction 
			BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
			Map<String, Object> requestContext = bp.getRequestContext();
			requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
			requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY,	Boolean.TRUE);
			requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");
			
			// Initialiser WSSGenerationContext
			WSSGenerationContext gencont = factory.newWSSGenerationContext();
	        gencont.add(samlToken);		        
	        
	        // Ajouter des jetons X.509 pour la protection des messages
            X509GenerateCallbackHandler x509callbackHandler = new X509GenerateCallbackHandler(
        			null,
        			"racine_profil/etc/ws-security/samples/dsig-sender.ks", 
        			"JKS", 
        			"client".toCharArray(), 
        			"soaprequester", 
        			"client".toCharArray(), 
        			"CN=SOAPRequester, OU=TRL, O=IBM, ST=Kanagawa, C=JP", null);	

            SecurityToken x509 = factory.newSecurityToken(X509Token.class,
            x509callbackHandler, "system.wss.generate.x509");

            WSSSignature sig = factory.newWSSSignature(x509);
            sig.setSignatureMethod(WSSSignature.RSA_SHA1);
                	
            WSSSignPart sigPart = factory.newWSSSignPart();
            sigPart.setSignPart(samlToken);
            sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
            sig.addSignPart(sigPart);                	
            sig.addSignPart(WSSSignature.BODY);
            
	        // Ajouter l'horodatage
	        WSSTimestamp timestamp = factory.newWSSTimestamp();
			gencont.add(timestamp);
        	sig.addSignPart(WSSSignature.TIMESTAMP);
            
        	gencont.add(sig);
        	
			
        	WSSConsumingContext concont = factory.newWSSConsumingContext();
        	
        	// Préparer la consommation de l'horodatage dans le message de réponse
	     	concont.add(WSSConsumingContext.TIMESTAMP); 
	        
	     	// Préparer la vérification de la signature numérique dans le message de réponse        	
	        X509Certificate x509cert = null;
	        try {
	                InputStream is = new FileInputStream("racine_profil/etc/ws-security/samples/intca2.cer");
	                CertificateFactory cf = CertificateFactory.getInstance("X.509");
	                x509cert = (X509Certificate)cf.generateCertificate(is);
	        } catch(FileNotFoundException e1){
	                throw new WSSException(e1);
	        } catch (CertificateException e2) {
	                throw new WSSException(e2);
	        }
	        Set<Object> eeCerts = new HashSet<Object>();
	        eeCerts.add(x509cert);

	        java.util.List<CertStore> certList = new java.util.ArrayList<CertStore>();
	        CollectionCertStoreParameters certparam = new CollectionCertStoreParameters(eeCerts);

	        CertStore cert = null;
	        try {
	                cert = CertStore.getInstance("Collection", certparam, "IBMCertPath");
	        } catch (NoSuchProviderException e1) {
	                throw new WSSException(e1);
	        } catch (InvalidAlgorithmParameterException e2) {
	                throw new WSSException(e2);
	        } catch (NoSuchAlgorithmException e3) {
	                throw new WSSException (e3);
	        }
	        if(certList != null ){
	                certList.add(cert);
	        }

	        X509ConsumeCallbackHandler callbackHandlerVer = new X509ConsumeCallbackHandler(
	        		"racine_profil/etc/ws-security/samples/dsig-receiver.ks",
	        		"JKS",
	        		"server".toCharArray(),
	        		certList,
	        		java.security.Security.getProvider("IBMCertPath"));

	        WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandlerVer);

	        ver.addRequiredVerifyPart(WSSVerification.BODY);
	        concont.add(ver);
						
	        gencont.process(requestContext);
	        concont.process(requestContext);
	        
	        // Générer l'objet d'entrée
			EchoStringInput echoParm = 
				new com.ibm.was.wssample.sei.echo.ObjectFactory().createEchoStringInput();
			echoParm.setEchoInput(input);
			System.out.println(">> CLIENT: SEI Echo to " + endpointURL);		
						
			// Appeler le service
			response = echo.echoOperation(echoParm).getEchoResponse();
						
			System.out.println(">> CLIENT: SEI Echo invocation complete.");
			System.out.println(">> CLIENT: SEI Echo response is: " + response);
		} catch (Exception e) {
			System.out.println(">> CLIENT: ERROR: SEI Echo EXCEPTION.");
			e.printStackTrace();
		}
	}
}
Lorsque ce modèle d'application client de services Web fonctionne correctement, vous recevez des messages du type :
SAMLToken id = _6CDDF0DBF91C044D211271166233407
Retrieving document at 'file:racine_profil/.../wsdl/'.
>> CLIENT: SEI Echo to http://localhost:9443/WSSampleSei/EchoService12
>> CLIENT: SEI Echo invocation complete.
>> CLIENT: SEI Echo response is: SOAP12==>>HELLO

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_configsamlsendervouches_msglevel_requeststs
Nom du fichier : twbs_configsamlsendervouches_msglevel_requeststs.html