Verificación de la firma mediante la API WSSVerification

Puede proteger los mensajes SOAP, sin utilizar conjuntos de políticas para la configuración, utilizando las API WSS (Web Services Security). Para verificar la información de firmas para las secciones de enlace del consumidor para la solicitud del lado del cliente, utilice la API WSSVerification. También debe especificar qué métodos de algoritmo y qué partes de firma del mensaje SOAP se van a verificar. La API WSSVerification forma parte del paquete com.ibm.websphere.wssecurity.wssapi.verification.

Antes de empezar

Utilice las API WSS, o configure los conjuntos de políticas utilizando la consola administrativa para verificar la información de firmas. Para proteger los mensajes SOAP, debe completar las tareas de firma siguientes:

  • Configurar la información de firmas.
  • Seleccionar los métodos de algoritmo para la firma y la verificación de firma.
  • Verificar la información de firmas.

Acerca de esta tarea

WebSphere Application Server utiliza la información de firmas para el generador predeterminado con objeto de firmar partes del mensaje y utiliza la firma digital XML con algoritmos existentes como, por ejemplo, RSA-SHA1 y HMAC-SHA1.

La firma XML define muchos métodos para describir información clave y permite la definición de un nuevo método. A menudo, es necesaria la canonicalización XML (C14N) cuando se utiliza la firma XML. La información se puede representar de varias formas dentro de los documentos XML serializados. El proceso C14N se utiliza para canonicalizar información XML. Seleccione un algoritmo C14N apropiado porque la información que se canonicaliza depende de este algoritmo.

En la tabla siguiente, se muestra la información de enlace necesaria y opcional, cuando se define una limitación de seguridad de firma digital (integridad).

Tabla 1. Partes de verificación de firma. Utilice las partes de verificación de firma para proteger los mensajes.
Partes de verificación Descripción
keywords
Añade partes de firma necesarias como destinos de verificación utilizando palabras clave. Se pueden especificar distintas partes de mensaje en la protección del mensaje para la solicitud en el lado del generador. Utilice las siguientes palabras clave para las partes de verificación de firma necesarias:
  • ADDRESSING_HEADERS
  • BODY
  • TIMESTAMP
Las cabeceras WS-Addressing no se cifran, pero se pueden firmar.
xpath Añade partes de verificación utilizando una expresión XPath.
part Añade el objeto WSSVerifyPart como una parte de verificación.
cabecera Añade la cabecera, especificada por QName, como una parte de verificación.

Para la información de verificación de firma, se producen determinados comportamientos predeterminados. La forma más sencilla de utilizar la API WSSVerification es utilizar el comportamiento predeterminado.

Los valores predeterminados son definidos por la API WSS para el método de conversión, el método de transformación, la señal de seguridad y las partes de verificación necesarias.

Tabla 2. Comportamientos de verificación de firma predeterminados. De forma predeterminada hay varias características de las partes de verificación de firma configuradas.
Decisiones de verificación de firma Comportamiento predeterminado
Qué método de firma utilizar (algoritmo) Establece el método del algoritmo de firma. Se pueden especificar tanto el cifrado de datos, como la firma, como la canonicalización. El método de firma predeterminado es RSA SHA1. WebSphere Application Server da soporte a los métodos de firma preconfigurados siguientes:
  • WSSVerification.RSA_SHA1: http://www.w3.org/2000/09/xmldsig#rsa-sha1
  • WSSVerification.HMAC_SHA1: http://www.w3.org/2000/09/xmldsig#hmac-sha1
El método de firma digital DSA-SHA1 (http://www.w3.org/2000/09/xmldsig#dsa-sha1) no está soportado.
Qué método de canonicalización utilizar (algoritmo) Establece el método del algoritmo de canonicalización. Se pueden especificar tanto el cifrado de datos, como la firma, como la canonicalización. El método de firma predeterminado es EXC_C14N. WebSphere Application Server da soporte a los métodos de canonicalización preconfigurados siguientes:
  • WSSVerification.EXC_C14N: http://www.w3.org/2001/10/xml-exc-c14n#
  • WSSVerification.C14N: http://www.w3.org/2001/10/xml-c14n#
Es necesaria la confirmación de firma Si la API WSSSignature especifica que es necesaria la confirmación de firma, la API WSSVerification verifica el valor de confirmación de firma en el mensaje de respuesta que tiene adjunto el valor de confirmación de firma cuando se recibió. La confirmación de firma se define en la especificación OASIS Web Services Security Versión 1.1.

La confirmación de firma predeterminado es false.

Qué señal de seguridad especificar (securityToken)

Añade el objeto securityToken como parte de firma. WebSphere Application Server establece la información de señal que se utiliza para la verificación.

WebSphere Application Server soporta las siguientes señales preconfiguradas para la firma:

  • Señal X.509
  • Señal de clave derivada
La información necesaria para las señales incluye la clase de la señal, la información del manejador de retorno de llamada y el nombre del módulo de inicio de sesión de JAAS.

Procedimiento

  1. Para verificar la firma en un mensaje SOAP utilizando la API WSSVerification, en primer lugar, asegúrese de que se haya instalado el servidor de aplicaciones.
  2. Utilice la API WSSVerification para establecer las partes del mensaje que se van a verificar y especificar los algoritmos en un mensaje SOAP. El proceso de la API WSS para la verificación de firma sigue estos pasos de proceso:
    1. Utiliza WSSFactory.getInstance() para obtener la instancia de implementación de la API de WSS.
    2. Crea la instancia WSSConsumingContext desde la instancia WSSFactory.
    3. Garantiza que se llama a WSSConsumingContext en la clase de implementación del proveedor JAX-WS. Debido a la naturaleza del modelo de programación de JAX-WS, se debe implementar un proveedor JAX-WS y se debe llamar a WSSConsumingContext para verificar la firma del mensaje SOAP.
    4. Crea WSSVerification desde la instancia WSSFactory.
    5. Añade la parte que se va a verificar. Si el método de conversión o el método de transformación se modifican, cree WSSVerifyPart y establézcala en WSSVerification.
    6. Establece los candidatos del método de canonicalización, si el valor predeterminado no es apropiado.
    7. Establece los candidatos del método de firma, si el valor predeterminado no es apropiado.
    8. Establece la señal de seguridad del candidato, si el valor predeterminado no es apropiado.
    9. Llama a requireSignatureConfirmation(), si se aplica la confirmación de firma.
    10. Añade WSSVerification a WSSConsumingContext.
    11. Llama a WSSConsumingContext.process() con el contexto del mensaje SOAP.

Resultados

Ha completado los pasos para verificar la firma para la sección del consumidor de los enlaces. Si se produce una condición de error, se proporciona una excepción WSSException. Si es correcto, se llama a WSSConsumingContext.process() y se aplica Web Services Security al mensaje SOAP.

Ejemplo

En el ejemplo siguiente se proporciona código de ejemplo que utiliza métodos que se definen en la API WSSVerification:

// 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 concont = factory.newWSSConsumingContext();


// Generar la lista de certificados
	 String certpath = "c:/WebSphere/AppServer/etc/ws-security/samples/intca2.cer";
// La ubicación del archivo de certificados X509
	 X509Certificate x509cert = null;
	             try {
		    InputStream is = new FileInputStream(certpath);
		    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);  
// Crear el almacén de certificados
	  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);
	  }
// Generar el manejador de retorno de llamada
	  X509ConsumeCallbackHandler callbackHandler = new X509ConsumeCallbackHandler(
			  "dsig-receiver.ks", 
			  "jks",
			  "server".toCharArray(), 
			  certList, 
			  java.security.Security.getProvider("IBMCertPath")
	  );

// Generar la instancia WSSVerification (paso: d)
	 WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandler);

// Establecer la parte que se va a verificar (paso: e)
// DEFAULT: WSSVerification.BODY, WSSSignature.ADDRESSING_HEADERS, 
// y WSSSignature.TIMESTAMP.

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

// Establecer la parte especificada por la palabra clave (paso: e)
	    ver.addRequiredVerifyPart(WSSVerification.BODY);

// Establecer la parte especificada por WSSVerifyPart (paso: e)
	 WSSVerifyPart verPart = factory.newWSSVerifyPart();
	    verPart.setRequiredVerifyPart(WSSVerification.BODY);
	    verPart.addAllowedDigestMethod(WSSVerifyPart.SHA256);
	    ver.addRequiredVerifyPart(verPart);

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


// Establecer uno o más candidatos del método de canonicalización para verificación (paso: f)
// DEFAULT : WSSVerification.EXC_C14N
	   ver.addAllowedCanonicalizationMethod(WSSVerification.C14N);
	   ver.addAllowedCanonicalizationMethod(WSSVerification.EXC_C14N);

// Establecer uno o más candidatos del método de firma para verificación (paso: g)
// DEFAULT : WSSVerification.RSA_SHA1
	   ver.addAllowedSignatureMethod(WSSVerification.HMAC_SHA1);

// Establecer la señal de seguridad del candidato que se va a utilizar para la verificación (paso: h)
	 X509ConsumeCallbackHandler callbackHandler2 = getCallbackHandler2();
	   ver.addToken(X509Token.class, callbackHandler2);


// Establecer el código para requerir la confirmación de firma (paso: i)
	  ver.requireSignatureConfirmation();

// Añadir WSSVerification a WSSConsumingContext (paso: j)
	 concont.add(ver);

//Validar la cabecera de WS-Security (paso: k)
concont.process(msgcontext);

Qué hacer a continuación

Después de verificar la firma y establecer los métodos del algoritmo para el mensaje SOAP, puede establecer el método de conversión o el método de transformación. Si desea establecer estos métodos, utilice la API WSSVerifyPart, o configure conjuntos de políticas mediante la consola administrativa.


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_confsignaturecon
File name: twbs_confsignaturecon.html