Déchiffrement des messages SOAP à l'aide de l'API WSSDecryption
Vous pouvez sécuriser les messages SOAP, sans utiliser d'ensemble de règles de configuration, en utilisant les API Web Services Security (WSS API). Pour configurer le client pour le déchiffrement des messages SOAP côté destinataire de la réponse (client), utilisez l'API WSSDecryption. L'API WSSDecryption définit les portions de message de demande SOAP à déchiffrer lors de la configuration du client.
Avant de commencer
Vous pouvez utiliser l'API WSS ou des ensembles de règles dans la console d'administration pour activer le déchiffrement et ajouter des jetons de sécurité du destinataire dans le message SOAP. Pour sécuriser les messages SOAP, vous devez avoir effectué les tâches de déchiffrement suivantes :
- Chiffrement du message SOAP
- Choix de la méthode de déchiffrement
Pourquoi et quand exécuter cette tâche
Les informations de déchiffrement côté destinataire servent à déchiffrer les messages SOAP entrants pour les liaisons du destinataire de la réponse (côté client). La configuration du destinataire client doit correspondre à celle du fournisseur générateur.
Les paramètres de confidentialité exigent l'application de contraintes de confidentialité aux messages générés.
Les portions de déchiffrement suivantes peuvent être configurées :
Parties déchiffrées | Description |
---|---|
part | Définit l'objet WSSDecryptPart comme cible de la portion déchiffrée. |
keyword | Définit, à l'aide de mots clés, la portion déchiffrée. WebSphere Application Server prend en charge
les mots clés suivants :
|
xpath | Ajoute la portion déchiffrée à l'aide d'une expression XPath. |
verification | Ajoute l'instance WSSVerification comme cible de la portion déchiffrée. |
header | Ajoute l'en-tête SOAP, indiqué par QName, comme cible de la portion déchiffrée. |
Certains comportements par défaut s'appliquent aux portions déchiffrées. La façon la plus simple d'utiliser l'API WSS pour le déchiffrement est d'appliquer les comportements par défaut (voir l'exemple de code). WSSDecryption fournit des valeurs par défaut pour l'algorithme de chiffrement de clé, l'algorithme de chiffrement de données et les portions déchiffrées, comme le contenu du corps SOAP et la signature. Les comportements par défaut des portions déchiffrées incluent :
Choix de déchiffrement | Comportement par défaut |
---|---|
Les portions à déchiffrer | Par défaut, les portions à déchiffrer sont BODY_CONTENT et SIGNATURE. WebSphere Application Server prend en charge les mots clés suivants :
Après avoir indiqué les portions du message à déchiffrer, vous devez préciser la méthode à employer lors du déchiffrement du message de demande du destinataire. Par exemple, si le chiffrement est appliqué à la signature et au contenu du corps, les portions du message SOAP déchiffrées sont les mêmes. |
Le chiffrement, ou non, de la clé (isEncrypt) | La valeur par défaut consiste à chiffrer la clé (true). |
L'algorithme de déchiffrement (method) | L'algorithme de déchiffrement de données par défaut est AES128. WebSphere Application Server prend en charge les méthodes de chiffrement de données suivantes :
|
La méthode de déchiffrement de clé (algorithm) | La méthode d'algorithme de déchiffrement de clé par défaut est l'encapsulation de clé RSA OAEP. WebSphere Application Server prend en charge les méthodes de chiffrement suivantes :
|
Le jeton de sécurité | Le type de jeton de sécurité par défaut est le jeton X509. WebSphere Application Server fournit les types de jeton de destinataire préconfigurés suivants :
|
Procédure
Résultats
Exemple
L'exemple suivant fournit un exemple de code pour déchiffrer le contenu du corps d'un message SOAP :
// Obtenir le contexte de message
Object msgcontext = getMessageContext();
// Générer l'instance WSSFactory (étape : a)
WSSFactory factory = WSSFactory.getInstance();
// Générer l'instance WSSConsumingContext (étape : b)
WSSConsumingContext gencont = factory.newWSSConsumingContext();
// Générer le gestionnaire d'appel (étape : c)
X509ConsumeCallbackHandler callbackHandler = new
X509ConsumeCallbackHandler(
"",
"enc-sender.jceks",
"jceks",
"storepass".toCharArray(),
"alice",
"keypass".toCharArray(),
"CN=Alice, O=IBM, C=US");
// Générer l'instance WSSDecryption (étape : d)
WSSDecryption dec = factory.newWSSDecryption(X509Token.class,
callbackHandler);
// Définir la portion à chiffrer (étape : e)
// PAR DEFAUT : WSSEncryption.BODY_CONTENT and WSSEncryption.SIGNATURE
// Définir la portion à chiffrer (étape : e)
// PAR DEFAUT : WSSEncryption.BODY_CONTENT and WSSEncryption.SIGNATURE
// Définir la portion indiquée par le mot clé (étape : e)
dec.addRequiredDecryptPart(WSSDecryption.BODY_CONTENT);
// Définir la portion dans l'en-tête SOAP indiquée par QName (étape : e)
dec.addRequiredDecryptHeader(new
QName("http://www.w3.org/2005/08/addressing",
"MessageID"));
// Définir la portion indiquée par WSSVerification (étape : e)
X509ConsumeCallbackHandler verifyCallbackHandler =
getCallbackHandler();
WSSVerification ver = factory.newWSSVerification(X509Token.class,
verifyCallbackHandler);
dec.addRequiredDecryptPart(ver);
// Définir la portion indiquée par l'expression XPath (étape : e)
StringBuffer sb = new StringBuffer();
sb.append("/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/'
and local-name()='Envelope']");
sb.append("/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/'
and local-name()='Body']");
sb.append("/*[namespace-uri()='http://xmlsoap.org/Ping'
and local-name()='Ping']");
sb.append("/*[namespace-uri()='http://xmlsoap.org/Ping'
and local-name()='Text']");
dec.addRequiredDecryptPartByXPath(sb.toString());
// Définir la portion dans l'en-tête SOAP à déchiffrer indiquée par QName (étape : e)
dec.addRequiredDecryptHeader(new
QName("http://www.w3.org/2005/08/addressing",
"MessageID"));
// Définir les candidats pour les méthodes de chiffrement de données (étape : f)
// PAR DEFAUT : WSSDecryption.AES128
dec.addAllowedEncryptionMethod(WSSDecryption.AES128);
dec.addAllowedEncryptionMethod(WSSDecryption.AES192);
// Définir les condidats pour la méthode de chiffrement de clé (étape : g)
// PAR DEFAUT : WSSDecryption.KW_RSA_OAEP
dec.addAllowedKeyEncryptionMethod(WSSDecryption.KW_TRIPLE_DES);
// Définir candidat pour le jeton de sécurité à utiliser pour le déchiffrement (étape : h)
X509ConsumeCallbackHandler callbackHandler2 = getCallbackHandler2();
dec.addToken(X509Token.class, callbackHandler2);
// Définir si la clé doit être chiffrée dans le message SOAP entrant (étape : i)
// PAR DEFAUT : true
dec.encryptKey(true);
// Ajouter WSSDecryption à WSSConsumingContext (étape : j)
concont.add(dec);
// Valider l'en-tête WS-Security (étape : k)
concont.process(msgcontext);
Que faire ensuite
Utilisez ensuite l'API WSSDecryptPart, ou configurez les ensembles de règles à l'aide de la console d'administration pour ajouter des portions déchiffrées pour le message du destinataire.