Descifrado de mensajes SOAP con la API WSSDecryption
Puede proteger los mensajes SOAP, sin utilizar conjuntos de políticas para la configuración, utilizando las API de WSS (Web Services Security). Para configurar el cliente para el descifrado en el lado del consumidor de respuestas (cliente), utilice la API WSSDecryption para descifrar los mensajes SOAP. La API WSSDecryption especifica qué partes del mensaje SOAP de solicitud se van a descifrar al configurar el cliente.
Antes de empezar
Puede utilizar la API de WSS o los conjuntos de políticas en la consola administrativa para habilitar el descifrado y añadir las señales de seguridad del consumidor en el mensaje SOAP. Para proteger los mensajes SOAP, debe haber completado las tareas de descifrado siguientes:
- Cifrar el mensaje SOAP.
- Seleccionar el método de descifrado.
Acerca de esta tarea
La información de descifrado en el lado del consumidor se utiliza para descifrar un mensaje SOAP entrante para los enlaces del consumidor de respuestas (lado del cliente). La configuración del consumidor de clientes debe coincidir con la configuración del generador de proveedores.
Los valores de confidencialidad requieren que las limitaciones de confidencialidad se apliquen a los mensajes generados.
Se pueden configurar las partes de descifrado siguientes:
Partes de descifrado | Descripción |
---|---|
part | Añade el objeto WSSDecryptPart como un destino de la parte de descifrado. |
palabra clave | Añade la parte de descifrado utilizando palabras clave. WebSphere Application Server da soporte a las palabras clave siguientes:
|
xpath | Añade la parte de descifrado utilizando una expresión XPath. |
verification | Añade la instancia WSSVerification como un destino de la parte de descifrado. |
cabecera | Añade la cabecera de SOAP, especificada por QName, como un destino de la parte de descifrado. |
Para el descifrado, se producen determinados comportamientos predeterminados. La formas más fácil de utilizar la API de WSS para el descifrado es utilizar el comportamiento predeterminado (consulte el código de ejemplo). WSSDecryption proporciona valores predeterminados para el algoritmo de cifrado de claves, el algoritmo de cifrado de datos, y las partes de descifrado como, por ejemplo, el contenido del cuerpo SOAP y la firma. Los comportamientos predeterminados del descifrado incluyen:
Decisiones de descifrado | Comportamiento predeterminado |
---|---|
Qué partes descifrar | Las partes de descifrado predeterminadas son BODY_CONTENT y SIGNATURE. WebSphere Application Server soporta el uso de estas palabras clave:
Después de especificar qué partes del mensaje desea descifrar, debe especificar qué método utilizar cuando se descifra el mensaje de solicitud del consumidor. Por ejemplo, si para el cifrado se aplican tanto la firma como el contenido del cuerpo, las partes del mensaje SOAP que se han descifrado incluyen las mismas partes. |
Si se va a cifrar la clave (isEncrypt) | El valor por omisión es cifrar la clave (true). |
Qué algoritmo de descifrado de datos seleccionar (método) | El método del algoritmo de descifrado de datos predeterminado es AES128. WebSphere Application Server soporta estos métodos de cifrado de datos:
|
Qué método de descifrado de claves seleccionar (algoritmo) | El método del algoritmo de descifrado de claves predeterminado es la envoltura de claves RSA OAEP. WebSphere Application Server soporta estos métodos de cifrado de claves:
|
Qué señal de seguridad especificar | El tipo de señal de seguridad predeterminado es la señal X509. WebSphere Application Server proporciona los siguientes tipos de señal del consumidor preconfigurados:
|
Procedimiento
Resultados
Ejemplo
En el ejemplo siguiente se proporciona código de ejemplo para descifrar el contenido del cuerpo del mensaje SOAP:
// Obtener el contexto de mensaje
Object msgcontext = getMessageContext();
// Generar la instancia WSSFactory (paso: a)
WSSFactory factory = WSSFactory.getInstance();
// Generar la instancia WSSConsumingContext (paso: b)
WSSConsumingContext gencont = factory.newWSSConsumingContext();
// Generar el manejador de retorno de llamada (paso: c)
X509ConsumeCallbackHandler callbackHandler = new
X509ConsumeCallbackHandler(
"",
"enc-sender.jceks",
"jceks",
"storepass".toCharArray(),
"alice",
"keypass".toCharArray(),
"CN=Alice, O=IBM, C=US");
// Generar la instancia WSSDecryption (paso: d)
WSSDecryption dec = factory.newWSSDecryption(X509Token.class,
callbackHandler);
// Establecer la parte que se va cifrar (paso: e)
// DEFAULT: WSSEncryption.BODY_CONTENT and WSSEncryption.SIGNATURE
// Establecer la parte que se va cifrar (paso: e)
// DEFAULT: WSSEncryption.BODY_CONTENT and WSSEncryption.SIGNATURE
// Establecer la parte especificada por la palabra clave (paso: e)
dec.addRequiredDecryptPart(WSSDecryption.BODY_CONTENT);
// Establecer la parte de la cabecera SOAP especificada por QName (paso: e)
dec.addRequiredDecryptHeader(new
QName("http://www.w3.org/2005/08/addressing",
"MessageID"));
// Establecer la parte especificada por WSSVerification (paso: e)
X509ConsumeCallbackHandler verifyCallbackHandler =
getCallbackHandler();
WSSVerification ver = factory.newWSSVerification(X509Token.class,
verifyCallbackHandler);
dec.addRequiredDecryptPart(ver);
// Establecer la parte especificada por la expresión XPath (paso: 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());
// Establecer la parte de la cabecera SOAP que se va a descifrar especificada por QName (paso: e)
dec.addRequiredDecryptHeader(new
QName("http://www.w3.org/2005/08/addressing",
"MessageID"));
// Establecer los candidatos para el método de cifrado de datos (paso: f)
// DEFAULT : WSSDecryption.AES128
dec.addAllowedEncryptionMethod(WSSDecryption.AES128);
dec.addAllowedEncryptionMethod(WSSDecryption.AES192);
// Establecer los candidatos para el método de cifrado de claves (paso: g)
// DEFAULT : WSSDecryption.KW_RSA_OAEP
dec.addAllowedKeyEncryptionMethod(WSSDecryption.KW_TRIPLE_DES);
// Establecer la señal de seguridad del candidato que se va a utilizar para el descifrado (paso: h)
X509ConsumeCallbackHandler callbackHandler2 = getCallbackHandler2();
dec.addToken(X509Token.class, callbackHandler2);
// Establecer si se debe cifrar la clave en el mensaje SOAP entrante (paso: i)
// DEFAULT: true
dec.encryptKey(true);
// Añadir WSSDecryption a WSSConsumingContext (paso: j)
concont.add(dec);
//Validar la cabecera de WS-Security (paso: k)
concont.process(msgcontext);
Qué hacer a continuación
A continuación, utilice la API WSSDecryptPart o configure los conjuntos de políticas utilizando la consola administrativa para añadir partes descifradas para el mensaje del consumidor.