Envoi des jetons holder-of-key SAML auto-générés avec une clé symétrique en utilisant les API WSS

Vous pouvez créer des jetons SAML auto-générés avec la méthode de confirmation du sujet holder-of-key (envoyeur garant), puis les envoyer dans des messages de demande de services Web dotés de la protection au niveau du transport SSL, à l'aide du modèle de programmation JAX-WS (Java™ API for XML-Based Web Services) et des API WSS (Web Services Security).

Avant de commencer

On considère ici que vous connaissez le modèle de programmation JAX-WS, les API WSS, les concepts de SAML et l'utilisation des ensembles de règles pour configurer et administrer les paramètres des services Web. Procédez comme suit avant de commencer cette tâche :
  • Informez-vous sur l'envoi des jetons SAML bearer (porteurs) auto-générés à l'aide des API WSS.
  • Consultez la documentation sur l'envoi des jetons sender-vouches SAML auto-générés en utilisant les API WSS avec une protection de niveau de message.

Pourquoi et quand exécuter cette tâche

Cette tâche se concentre sur l'utilisation de la clé symétrique identifiée par les jetons de sécurité SAML pour générer une signature numérique d'éléments de messages SOAP sélectionnés afin de répondre aux besoin de sécurité de la méthode de confirmation de sujet holder-of-key. La règle de sécurité des services Web jointe au fournisseur de services Web concerne l'ensemble de règles SAML20 HoK Symmetric WSSecurity default livré avec WebSphere Application Server 7.0.0.7 et versions ultérieures.

Procédure

  1. Créez un jeton de sécurité SAML qui contient la méthode de confirmation de sujet holder-of-key, par exemple :
    WSSFactory factory = WSSFactory.getInstance();
    // Initialiser WSSGenerationContext
    com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext gencont = factory.newWSSGenerationContext();
    // Initialiser la configuration de l'émetteur SAML via les propriétés personnalisées
    HashMap<Object, Object> customProps = new HashMap<Object,Object>();
    
    customProps.put(SamlConstants.ISSUER_URI_PROP, "example.com");
    customProps.put(SamlConstants.TTL_PROP, "3600000");
    customProps.put(SamlConstants.KS_PATH_PROP, "keystores/saml-provider.jceks");
    customProps.put(SamlConstants.KS_TYPE_PROP, "JCEKS");
    customProps.put(SamlConstants.KS_PW_PROP, "{xor}LCswLTovPiws");
    customProps.put(SamlConstants.KEY_ALIAS_PROP, "samlissuer");
    customProps.put(SamlConstants.KEY_NAME_PROP, "CN=SAMLIssuer, O=EXAMPLE");
    customProps.put(SamlConstants.KEY_PW_PROP, "{xor}NDomLz4sLA==");
    customProps.put(SamlConstants.TS_PATH_PROP, "keystores/saml-provider.jceks");
    customProps.put(SamlConstants.TS_TYPE_PROP, "JCEKS");
    customProps.put(SamlConstants.TS_PW_PROP, "{xor}LCswLTovPiws"); 
    gencont.add(customProps); //Ajouter des propriétés personnalisées
    HashMap<Object, Object> map = new HashMap<Object, Object>();
    map.put(SamlConstants.CONFIRMATION_METHOD, "holder-of-key");
    map.put(SamlConstants.Token_REQUEST, "issue");
    map.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
    map.put(SamlConstants.SAML_NAME_IDENTIFIER, "Alice");
    map.put(SamlConstants.SIGNATURE_REQUIRED, "true");
    map.put(SamlConstants.SERVICE_ALIAS, "soaprecipient");
    map.put(SamlConstants.KEY_TYPE, 
            "http://docs.oasis-open.org/ws-sx/ws-trust/200512/SymmetricKey");
    map.put(SamlConstants.SAML_APPLIES_TO, "http://localhost:9080/your_Web_service");
    map.put(RequesterConfiguration.RSTT.ENCRYPTIONALGORITHM,
            "http://www.w3.org/2001/04/xmlenc#aes256-cbc");
    map.put(SamlConstants.KEY_SIZE, "256");
    SAMLGenerateCallbackHandler callbackHandler = new SAMLGenerateCallbackHandler(map); 
    SAMLToken samlToken = (SAMLToken) factory.newSecurityToken(SAMLToken.class,
            callbackHandler, "system.wss.generate.saml");

    La clé de preuve imbriquée du jeton de sécurité SAML est chiffrée pour le service Web cible. La clé publique du service cible chiffrant la clé de preuve est spécifiée par la propriété SamlConstants.SERVICE_ALIAS qui spécifie un certificat public dans le fichier de confiance. L'emplacement du fichier de confiance est spécifié par une propriété personnalisée com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext. Dans cet exemple, vous devez importer le fichier de règles Java Cryptography Extension (JCE) car le chiffrement utilise une taille de clé de 256 octets. Pour plus d'informations, consultez la section concernant l'utilisation des fichiers de règles JCE sans restriction dans la rubrique "Optimisation de la sécurité des services Web".

    Si vous préférez utiliser les clés dérivées pour la signature numérique et pour le chiffrement à la place de la clé symétrique directement, ajoutez la paire suivante nom-valeur :

    map.put(SamlConstants.REQUIRE_DKT, "true");
  2. Utilisez l'objet WSSGenerationContext pour préparer le traitement de l'en-tête de sécurité du message de demande, par exemple :
    gencon.add(samlToken); //this line of code can be omitted
    
    WSSTimestamp timestamp = factory.newWSSTimestamp();
    gencon.add(timestamp);
    
    WSSSignature sig = factory.newWSSSignature(samlToken);
    
    sig.setSignatureMethod(WSSSignature.HMAC_SHA1);
    sig.setCanonicalizationMethod(WSSSignature.EXC_C14N);
    sig.addSignPart(WSSSignature.BODY);
    sig.addSignPart(WSSSignature.TIMESTAMP);
    sig.addSignPart(WSSSignature.ADDRESSING_HEADERS);
    sig.setTokenReference(SecurityToken.REF_KEYID);
    //If the gencon.add(samlToken); line of code is omitted, or DerivedKey is used
    //the above line of code must be replaced with
    //sig.setTokenReference(SecurityToken.REF_STR);
    
    gencon.add(sig);
    
    WSSEncryption enc = factory.newWSSEncryption(samlToken); 
    
    enc.setEncryptionMethod(WSSEncryption.AES256);
    enc.setTokenReference(SecurityToken.REF_KEYID);
    //If the gencon.add(samlToken); line of code is omitted, or DerivedKey is used
    //the above line of code must be replaced with
    //enc.setTokenReference(SecurityToken.REF_STR);
    enc.encryptKey(false);
    enc.addEncryptPart(WSSEncryption.BODY_CONTENT);
    enc.addEncryptPart(WSSEncryption.SIGNATURE);
    gencon.add(enc);
  3. Créez l'objet WSSConsumingContext pour préparer le traitement d'en-tête de sécurité, le message de réponse, par exemple :
    WSSConsumingContext concont = factory.newWSSConsumingContext();
    
    HashMap<Object, Object> map = new HashMap<Object, Object>();
    
    SAMLConsumerCallbackHandler callbackHandler = new
            SAMLConsumerCallbackHandler(map); 
    
    WSSDecryption dec = factory.newWSSDecryption(SAMLToken.class, callbackHandler,
            "system.wss.consume.saml");
    dec.addAllowedEncryptionMethod(WSSDecryption.AES256);
    dec.encryptKey(false);
    dec.addRequiredDecryptPart(WSSDecryption.BODY_CONTENT); 
    
    concont.add(dec);
    
    callbackHandler = new SAMLConsumerCallbackHandler(map);
    WSSVerification ver = factory.newWSSVerification(SAMLToken.class, callbackHandler,
            "system.wss.consume.saml");
    ver.addAllowedSignatureMethod(WSSVerification.HMAC_SHA1);
    ver.addRequiredVerifyPart(WSSVerification.BODY);
    ver.addRequiredVerifyPart(WSSVerification.TIMESTAMP);
    
    concont.add(ver);
  4. Utilisez l'utilitaire JDK keytool pour générer les fichiers saml-provider.jceks et recipient.jceks utilisés pour tester l'exemple de code, par exemple :
    keytool -genkey -alias samlissuer -keystore saml-provider.jceks -dname "CN=SAMLIssuer, O=ACME" -storepass issuerstorepass
     -keypass issuerkeypass -storetype jceks -validity 5000 -keyalg RSA -keysize 2048
    
    keytool -genkey -alias soaprecipient -keystore recipient.jceks -dname "CN=SOAPRecipient, O=ACME" -storepass reciptstorepass -keypass reciptkeypass -storetype jceks -validity 5000 -keyalg RSA -keysize 2048
    
    keytool -export -alias soaprecipient -file reciptpub.cer -keystore recipient.jceks -storepass reciptstorepass -storetype jceks
    
    keytool -import -alias soaprecipient -file reciptpub.cer -keystore saml-provider.jceks -storepass issuerstorepass -storetype jceks
     -keypass issuerkeypass -noprompt

Résultats

Les blocs de création de clé sont maintenant en capacité de créer une application client de services Web afin d'envoyer un jeton de sécurité SAML dans un message SOAP et d'utiliser la clé symétrique imbriquée dans la sécurité SAML dans la protection au niveau du message.


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_configsamlhok_symmetric_usingwssapi
Nom du fichier : twbs_configsamlhok_symmetric_usingwssapi.html