Cifrado del mensaje SOAP mediante la API WSSEncryption

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 cifrado de solicitudes en el lado del generador, utilice la API WSSEncryption para cifrar el mensaje SOAP. La API WSSEncryption especifica las partes del mensaje SOAP de solicitud que se van a cifrar cuando se configura el cliente.

Antes de empezar

Puede utilizar la API de WSS o los conjuntos de políticas en la consola administrativa para habilitar el cifrado y añadir señales de seguridad del generador en el mensaje SOAP. Para proteger mensajes SOAP, utilice las API de WSS para completar las tareas de cifrado siguientes, según sea necesario:

  • Configurar el cifrado y seleccionar los métodos de cifrado utilizando la API WSSEncryption.
  • Configurar las partes cifradas, según sea necesario, utilizando la API WSSEncryptPart.

Acerca de esta tarea

La información de cifrado en el lado del generador se utiliza para cifrar un mensaje SOAP saliente para los enlaces del generador de solicitudes (lado del cliente). La configuración del generador de clientes debe coincidir con la configuración del consumidor de proveedores.

Utilización de la API WSSEncryption para cifrar un mensaje SOAP saliente

Los valores de confidencialidad requieren que las limitaciones de confidencialidad se apliquen a los mensajes generados. Estas limitaciones incluyen especificar las partes del mensaje dentro del mensaje generado que se deben cifrar y las partes del mensaje a las que se adjuntan los elementos Nonce y timestamp cifrados.

Se pueden configurar las siguientes partes de cifrado:

Tabla 1. Partes de cifrado. Utilice las partes de cifrado para habilitar el cifrado en los mensajes.
Partes de cifrado Descripción
part Añade el objeto WSSEncryptPart como un destino de la parte de cifrado.
palabra clave Añade las partes de cifrado utilizando palabras clave. WebSphere Application Server da soporte a las palabras clave siguientes:
  • BODY_CONTENT
  • SIGNATURE
xpath Añade la parte de cifrado utilizando una expresión XPath.
signature Añade el componente WSSignature como un destino de la parte cifrada.
cabecera Añade la cabecera SOAP, especificada por QName, como un destino de la parte cifrada.
securityToken Añade el objeto SecurityToken como un destino de la parte cifrada.

Para el cifrado, se producen determinados comportamientos predeterminados. La forma más fácil de utilizar la API WSSEncryption es utilizar el comportamiento predeterminado (consulte el código de ejemplo).

WSSEncryption proporciona valores predeterminados para el algoritmo del cifrado de claves, el algoritmo del cifrado de datos, el método de referencia de señal de seguridad y las partes de cifrado como, por ejemplo, el contenido del cuerpo SOAP y la firma. Los comportamientos predeterminados de cifrado incluyen:

Tabla 2. Decisiones de cifrado. Utilice el comportamiento predeterminado de cifrado para proteger el contenido y la firma del cuerpo del mensaje.
Decisiones de cifrado Comportamiento predeterminado
Qué partes del mensaje SOAP cifrar utilizando palabras clave

Establece las partes de cifrado que puede añadir utilizando palabras clave. Las partes de cifrado predeterminado son BODY_CONTENT y SIGNATURE. WebSphere Application Server soporta el uso de estas palabras clave:

  • WSSEncryption.BODY_CONTENT
  • WSSEncryption.SIGNATURE
Qué método de cifrado de datos seleccionar (algoritmo)

Establece el método de cifrado de datos. Se pueden especificar los métodos de cifrado de datos y también de claves. El método de algoritmo de cifrado de datos predeterminado es AES 128. WebSphere Application Server soporta estos métodos de cifrado de datos:

  • WSSEncryption.AES128: http://www.w3.org/2001/04/xmlenc#aes128-cbc
  • WSSEncryption.AES192: http://www.w3.org/2001/04/xmlenc#aes192-cbc
  • WSSEncryption.AES256: http://www.w3.org/2001/04/xmlenc#aes256-cbc
  • WSSEncryption.TRIPLE_DES: http://www.w3.org.2001/04/xmlenc#tripledes-cbc
Si se va a cifrar la clave (isEncrypt)

Especifica si se va a cifrar la clave. Los valores son true o false. El valor por omisión es cifrar la clave (true).

Qué método de cifrado de claves seleccionar (algoritmo)

Establece el método de cifrado de claves. Se pueden especificar los métodos de cifrado de datos y también de claves. El método de algoritmo del cifrado de claves predeterminado es envoltura de claves RSA OAEP. WebSphere Application Server soporta estos métodos de cifrado de claves:

  • WSSEncryption.KW_AES128: http://www.w3.org/2001/04/xmlenc#kw-aes128
  • WSSEncryption.KW_AES192: http://www.w3.org/2001/04/xmlenc#kw-aes192
  • WSSEncryption.KW_AES256: http://www.w3.org/2001/04/xmlenc#kw-aes256
  • WSSEncryption.KW_RSA_OAEP: http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p
  • WSSEncryption.KW_RSA15: http://www.w3.org/2001/04/xmlenc#rsa-1_5
  • WSSEncryption.KW_TRIPLE_DES: http://www.w3.org/2001/04/xmlenc#kw-tripledes
Qué señal de seguridad especificar (securityToken)

Establece SecurityToken. El tipo de la señal de seguridad predeterminado es X509Token. WebSphere Application Server proporciona los siguientes tipos de señal del consumidor preconfigurados:

  • Señal de clave derivada
  • Señales X.509
Qué referencia de señal utilizar (refType) Establece el tipo de referencia de la señal de seguridad. La referencia de la señal predeterminada es SecurityToken.REF_KEYID. WebSphere Application Server da soporte a los siguientes tipos de referencia de señales:
  • SecurityToken.REF_KEYID
  • SecurityToken.REF_STR
  • SecurityToken.REF_EMBEDDED
  • SecurityToken.REF_THUMBPRINT
Si se va a utilizar MTOM (mtomOptimize) Establece la optimización MTOM (Message Transmission Optimization Mechanism) para la parte cifrada.

Procedimiento

  1. Para cifrar el mensaje SOAP utilizando la API WSSDecryption, en primer lugar, asegúrese de que está instalado el servidor de aplicaciones.
  2. El proceso de la API de WSS para el cifrado realiza estos pasos de proceso:
    1. Utiliza WSSFactory.getInstance() para obtener la instancia de la implementación de la API de WSS
    2. Crea la instancia WSSGenerationContext desde la instancia WSSFactory.
    3. Crea SecurityToken a partir de WSSFactory utilizada para el cifrado.
    4. Crea WSSEncryption a partir de la instancia WSSFactory que utiliza SecurityToken. El comportamiento predeterminado de WSSEncryption es cifrar el contenido del cuerpo y la firma.
    5. Añade una parte nueva que se va a cifrar en WSSEncryption, si la parte existente no es apropiada. Después de llamar a addEncryptPart(), addEncryptHeader() o addEncryptPartByXPath(), se borra la parte predeterminada.
    6. Llama a encryptKey(false), si la clave no se va a cifrar.
    7. Establece el método de cifrado de datos, si el método predeterminado no es apropiado.
    8. Establece el método de cifrado de claves, si el método predeterminado no es apropiado.
    9. Establece la referencia de la señal, si la referencia de la señal predeterminada no es apropiada.
    10. Añade WSSEncryption a WSSConsumingContext.
    11. Llama a WSSGenerationContext.process() con el SOAPMessageContext.

Resultados

Si se produce una condición de error durante el cifrado, se proporciona una excepción WSSException. Si es correcto, la API llama a WSSGenerationContext.process(), se genera la cabecera de WS-Security y se protege el mensaje SOAP utilizando Web Services Security.

Ejemplo

En el ejemplo siguiente se proporciona código de ejemplo que utiliza métodos definidos en WSSEncryption:

// Obtener el contexto de mensaje 
   Object msgcontext = getMessageContext();

// Generar la instancia WSSFactory (paso: a)
WSSFactory factory = WSSFactory.getInstance();		

// Generar la instancia WSSGenerationContext (paso: b)
WSSGenerationContext gencont = factory.newWSSGenerationContext();

// Generar el manejador de retorno de llamada
X509GenerateCallbackHandler callbackHandler = new 
         X509GenerateCallbackHandler(
			  "",
			  "enc-sender.jceks",
			  "jceks", 
			  "storepass".toCharArray(), 
			  "bob", 
			  null, 
			  "CN=Bob, O=IBM, C=US", 
			  null);

// Generar la señal de seguridad utilizada para el cifrado (paso: c)
SecurityToken token = factory.newSecurityToken(X509Token.class , callbackHandler);

// Generar la instancia WSSEncryption (paso: d)
WSSEncryption enc = factory.newWSSEncryption(token);

// 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)
   enc.addEncryptPart(WSSEncryption.BODY_CONTENT);

// Establecer la parte de la cabecera SOAP especificada por QName  (paso: e)
   enc.addEncryptHeader(new QName("http://www.w3.org/2005/08/addressing",
                                  "MessageID"));

// Establecer la parte especificada por WSSSignature (paso: e)
   SecurityToken sigToken = getSecurityToken();
      WSSSignature sig = factory.newWSSSignature(sigToken);
   enc.addEncryptPart(sig);

// Establecer la parte especificada por SecurityToken  (paso: e)
   UNTGenerateCallbackHandler untCallbackHandler = 
	         	         new UNTGenerateCallbackHandler("Chris", "sirhC");		
      SecurityToken unt = factory.newSecurityToken(UsernameToken.class, 
                                                   untCallbackHandler);
   enc.addEncryptPart(unt, false);

// 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']");
   enc.addEncryptPartByXPath(sb.toString());

// Establecer si se va a cifrar la clave (paso: f)
// DEFAULT: true
   enc.encryptKey(true);

// Establecer el método de cifrado de datos (paso: g)
// DEFAULT: WSSEncryption.AES128
   enc.setEncryptionMethod(WSSEncryption.TRIPLE_DES);

// Establecer el método de cifrado de claves (paso: h)
// DEFAULT: WSSEncryption.KW_RSA_OAEP
   enc.setEncryptionMethod(WSSEncryption.KW_RSA15);

// Establecer la referencia de la señal (paso: i)
// DEFAULT: SecurityToken.REF_KEYID 
	 	 enc.setTokenReference(SecurityToken.REF_STR);

// Añadir WSSEncryption a WSSGenerationContext (paso: j)
  gencont.add(enc);

// Procesar la cabecera de WS-Security (paso: k)
gencont.process(msgcontext);
Nota: X509GenerationCallbackHandler no necesita la contraseña de clave porque se utiliza la clave pública para el cifrado. No necesita ninguna contraseña para obtener la clave pública del almacén de claves Java™.

Qué hacer a continuación

Si no especificado previamente los métodos de cifrado que se van a utilizar, utilice la API de WSS o configure los conjuntos de políticas utilizando la consola administrativa para seleccionar los métodos del algoritmo de cifrado de datos y de claves.


Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_confwssencryption
File name: twbs_confwssencryption.html