Solicitud de señales sender-vouches SAML de un STS externo utilizando las API de WSS y la protección de nivel de transporte

Puede solicitar señales SAML con el método de confirmación de sujetos sender-vouches a partir de un servicio de señales de seguridad (STS) externo. Tras obtener la señal sender-vouches de SAML, puede enviar estas señales con los mensajes de solicitud de servicios web mediante la API Java™ ara el modelo de programación de servicios web basados en XML (JAX-WS) y las API de seguridad de servicios web (API de WSS) con la protección de nivel de transporte.

Antes de empezar

En esta tarea se presupone que está familiarizado con el modelo de programación JAX-WS, las interfaces de las API de WSS, los conceptos de SAML, la protección de transporte SSL y el uso de conjuntos de políticas para configurar y administrar los valores de servicios web.

Acerca de esta tarea

Puede solicitar una señal SAML con el método de confirmación de sujeto de sender-vouches desde un STS externo y, a continuación, enviar la señal SAML en los mensajes de solicitud de servicios web de un cliente de servicios web utilizando las API de WSS con protección de nivel de transporte.

La aplicación cliente de servicios web que se utiliza en esta tarea es una versión modificada del código de cliente contenido en la aplicación de ejemplo JaxWSServicesSamples que está disponible para la descarga. Ejemplos de código del ejemplo se describen en el procedimiento, y se proporciona un completo y listo ejemplo de cliente de servicios web.

Procedimiento

  1. Identifique y obtenga el cliente de servicios web que desea utilizar para invocar un proveedor de servicios web.

    Utilice este cliente para insertar las señales SAML en los mensajes de solicitud SOAP mediante programación con las API de WSS.

    El cliente de servicios web que se utiliza en este procedimiento es una versión modificada del código de cliente contenido en la aplicación de ejemplo de servicios web JaxWSServicesSamples.

    Para obtener y modificar el cliente de servicios web de ejemplo a fin de añadir la API de seguridad de servicios Web para pasar señales sender-vouches SAML en los mensajes de solicitud SOAP mediante programación con las API de WSS, siga estos pasos:

    1. Descargue la aplicación de ejemplo JaxWSServicesSamples. El ejemplo JaxWSServicesSamples no está instalado de forma predeterminada.
    2. Obtenga el código de cliente de JaxWSServicesSamples.

      En el ejemplo, este procedimiento utiliza una versión modificada del ejemplo de cliente ligero Echo que se incluye en el ejemplo JaxWSServicesSamples. El archivo de ejemplo de cliente ligero Echo de servicios web, SampleClient.java, se encuentra en el directorio src\SampleClientSei\src\com\ibm\was\wssample\sei\cli. El archivo de clase de ejemplo está incluido en el archivo WSSampleClientSei.jar.

      La aplicación empresarial JaxWSServicesSamples.ear y los archivos Java (JAR) se encuentran en el directorio installableApps en la aplicación de ejemplo JaxWSServicesSamples.

    3. Despliegue el archivo JaxWSServicesSamples.ear en el servidor de aplicaciones. Tras desplegar el archivo JaxWSServicesSamples.ear, ya está preparado para probar el código de cliente de servicios web de ejemplo en la aplicación de ejemplo.

    En lugar de utilizar el ejemplo de cliente de servicios web, puede optar por añadir los fragmentos de código para pasar señales SAML en los mensajes de solicitud SOAP mediante programación con las API de WSS en su propia aplicación cliente de servicios web. El ejemplo de este procedimiento utiliza un cliente ligero de servicios Web JAX-WS; no obstante, también puede utilizar un cliente gestionado.

  2. Cree una copia del conjunto de políticas SAML20 Bearer WSHTTPS default o el conjunto de políticas SAML11 Bearer WSHTTPS default.

    Proporcione un nombre para la copia del conjunto de políticas; por ejemplo SAML20 SenderVouches WSHTTPS o SAML11 SenderVouches WSHTTPS para ayudarle a identificar que este conjunto de políticas nuevo utilice el método de confirmación sender-vouches.

    No es necesario ningún cambio adicional en el archivo de política porque el método de confirmación de sujeto se especifica en la configuración de enlace y no en la política.

    El archivo de política nuevo contiene SAMLToken20Bearer o SAMLToken11Bearer como identificadores de política. Cambie el identificador de la política SAMLToken20Bearer por SAMLToken20SV o cambie el identificador de la política SAMLToken11Bearer por SAMLToken11SV para especificar un nombre más descriptivo. Al cambiar el identificador de la política no cambia de ningún modo la aplicación de la política; sin embargo, la adición de un identificador descriptivo ayuda a identificar que tales identificadores de política utilicen el método de confirmación sender-vouches.

    Si desea ver los valores de estas políticas, utilice la consola administrativa para llevar a cabo estas acciones:
    1. Pulse Servicios > Conjuntos de políticas > Conjuntos de políticas de aplicación > nombre_conjunto_políticas.
    2. Pulse la política WS-Security en la tabla de políticas.
    3. Pulse el enlace Política principal o el enlace Política de rutina de carga.
    4. Pulse Políticas de señal de petición en la sección Detalles de política.
  3. Adjunte el nuevo conjunto de políticas SAML20 SenderVouches WSHTTPS o SAML11 SenderVouches WSHTTPS a la aplicación de proveedor de servicios web. Consulte la información sobre configuración de los enlaces de cliente y proveedor para la señal sender-vouches de SAML a fin de obtener detalles sobre cómo adjuntar este conjunto de políticas a la aplicación de proveedor de servicios web.
  4. Cree una copia de los enlaces generales predeterminados del ejemplo SAML Bearer Provider.
    1. Para la nueva copia del conjunto de políticas predeterminado, proporcione un nombre que incluya sender-vouches, por ejemplo Enlace de proveedor Sender-vouches de SAML.
    2. En el manejador de devolución de llamada del consumidor de señales SAML11 o SAML20, cambie el valor de la propiedad confirmationMethod a sender-vouches en la configuración de consumidor de señales de la versión de señal SAML que se pretenda. Asegúrese de que las propiedades personalizadas trustStoreType, trustStorePassword y trustStorePath se corresponden con el almacén de confianza que contiene el certificado de firmante STS. Consulte la información sobre configuración de los enlaces de cliente y proveedor para la señal sender-vouches de SAML a fin de obtener detalles sobre cómo modificar los enlaces sender-vouches a fin de satisface el requisito de comprobación.
  5. Asigne el nuevo enlace de proveedor al ejemplo de proveedor JaxWSServicesSamples. Lea acerca de la configuración de enlaces de cliente y proveedor para la sender-vouches de SAML para obtener detalles sobre la asignación de ejemplos de proveedor de sender-vouches SAML, los enlaces generales predeterminados a la aplicación de proveedor de servicios web.
  6. Habilite el atributo de configuración SSL de proveedor de servicios Web, clientAuthentication, para que exija la autenticación de certificado de cliente X.509.
    El atributo clientAuthentication determina si es necesaria la autenticación de cliente SSL. Para especificar el atributo clientAuthentication, utilice la consola administrativa para llevar a cabo las acciones siguientes:
    1. Pulse Seguridad > Certificados SSL y gestión de claves > Gestionar configuraciones de seguridad de punto final > {Entrada | Salida} > SSL_configuration.
    2. Haga clic en el enlace WC_defaulthost_secure de la topología de entrada.
    3. En Elementos relacionados, pulse el enlace SSL_configurations.
    4. Seleccione el recurso NodeDefaultSSLSettings.
    5. Pulse el enlace Valores QoP (calidad de protección).
    6. Seleccione Necesario en el menú para especificar la autenticación de cliente.

    Consulte la información sobre la creación de una configuración de capa de sockets segura para obtener más información sobre la configuración del atributo clientAuthentication.

  7. Especifique la utilización de la protección de mensajes de nivel de transporte SSL. Utilice la propiedad JVM siguiente para especificar la utilización de SSL para proteger la solicitud de señal SAML con el STS:
    -Dcom.ibm.SSL.ConfigURL=file:raíz_perfil\properties\ssl.client.props
    Como alternativa, puede definir el archivo de configuración SSL para que utilice una propiedad del sistema Java en el código de cliente de ejemplo; por ejemplo:
    System.setProperty("com.ibm.SSL.ConfigURL", "file:raíz_perfil/properties/ssl.client.props");
  8. Añada el archivo JAR del cliente ligero para JAX-WS a la variable class. Añada el archivo raíz_servidor_aplicaciones/runtimes/com.ibm.jaxws.thinclient_8.5.0.jar a la variable class. Consulte la información sobre cómo probar los clientes habilitados para servicios web para obtener más detalles sobre la adición de este archivo JAR a la variable class.
  9. Solicite la señal SAML de un STS externo. El fragmento de código siguiente ilustra cómo solicitar la señal sender-vouches de SAML y presupone que un STS externo está configurado para aceptar un UsernameToken y para emitir una señal SAML 1.1 utilizando sender-vouches después de validación:
    //Solicitar la señal SAML desde un STS externo
    WSSFactory factory = WSSFactory.getInstance();
    String STS_URI  = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
    String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
    WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
    WSSConsumingContext concont1 = factory.newWSSConsumingContext(); 
    HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
    cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
    cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
    cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
    cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
    cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML11_VALUE_TYPE);
    cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
    
    SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);
    
    // Añadir UNT a solicitud de confianza
    UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
    SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
    
    gencont1.add(ut);
    
    cbHandler1.setWSSConsumingContextForTrustClient(concont1);
    cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
    SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");
    
    System.out.println("SAMLToken id = " + samlToken.getId());
    1. Utilice el método newSecurityToken de WSSFactory para especificar cómo solicitar la señal SAML de un STS externo.
      Especifique el método siguiente para crear la señal SAML:
      WSSFactory  newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml")
      La solicitud de una señal SAML exige el permiso de seguridad Java wssapi.SAMLTokenFactory.newSAMLToken. Utilice Policy para añadir la sentencia de política siguiente al archivo de política de seguridad Java o al archivo was.policy de aplicación:
      permission java.security.SecurityPermission "wssapi.SAMLTokenFactory.newSAMLToken"

      El parámetro SAMLToken.class especifica el tipo de señal de seguridad que se debe crear.

      El objeto callbackHandler contiene parámetros que definen las características de la señal SAMLToken que está solicitando y otros parámetros necesarios para alcanzar el STS y obtener la señal SAML. El objeto SAMLGenerateCallbackHandler especifica los parámetros de configuración que se describen en la tabla siguiente:
      Tabla 1. Propiedades de SAMLGenerateCallbackHandler. En esta tabla se describen los parámetros de configuración para el objeto SAMLGenerateCallbackHandler que utilizan el método de confirmación sender-vouches.
      Propiedad Descripción Required
      SamlConstants.CONFIRMATION_METHOD Especifica que se utiliza el método de confirmación sender-vouches.
      SamlConstants.TOKEN_TYPE Especifica el tipo de señal.

      Cuando un cliente de servicios web tiene adjuntos de conjunto de políticas, el entorno de ejecución de seguridad de servicios Web no utiliza esta propiedad.

      Especifique el tipo de valor de señal utilizando el atributo valueType de la configuración de enlace de generador de señales.

      El ejemplo de este procedimiento utiliza una señal SAML 1.1; sin embargo, también puede utilizar el valor WSSConstants.SAML.SAML20_VALUE_TYPE .

      SamlConstants.STS_ADDRESS Especifica la dirección de servicio de señal de seguridad.

      En el ejemplo que se utiliza en este tema de la tarea, el valor de esta propiedad se establece en https para especificar la utilización de SSL para proteger la solicitud de señal SAML.

      Debe establecer la propiedad el-Dcom.ibm.SSL.ConfigURL para habilitar el uso de SSL para proteger la solicitud de señal SAML con el STS.

      SamlConstants.SAML_APPLIES_TO Especifica la dirección STS de destino para la que se desea utilizar la señal SAML. No
      SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST Especifica si se debe solicitar del STS una señal simple que está incluida en un elemento RequestSecurityToken (RST) o varias señales en una colección de elementos RST que están incluidas en un solo elemento RequestSecurityTokenCollection (RSTC).

      El comportamiento predeterminado es solicitar una señal simple que está incluida en un elemento RequestSecurityToken (RST) del STS.

      La especificación de un valor true para esta propiedad indica solicitar varias señales en una colección de elementos RST que están incluidas en un solo elemento RequestSecurityTokenCollection (RSTC) del STS.

      No
      SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE Especifica el espacio de nombres WS-Trust que se incluye en la solicitud WS-Trust.

      El valor predeterminado es WSTrust 1.3.

      No

      Una instancia de WSSGenerationContext y una instancia WSSConsumingContext también se han establecido en el objeto SAMLGenerateCallbackHandler. La instancia WSSGenerationContext debe contener un objeto UNTGenerateCallbackHandler con la información para crear el UsernameToken que desea enviar al STS.

      El parámetro system.wss.generate.saml especifica el LoginModule Java Authentication and Authorization Service (JAAS) que se utiliza para crear la señal SAML. Debe especificar una propiedad de JVM para definir un archivo de configuración JAAS que contenga la configuración de inicio de sesión JAAS necesaria; por ejemplo:
      -Djava.security.auth.login.config=raíz_perfil/properties/wsjaas_client.conf 
      Como alternativa, puede especificar un archivo de configuración de inicio de sesión JAAS estableciendo una propiedad del sistema Java en el código de cliente de ejemplo; por ejemplo:
      System.setProperty("java.security.auth.login.config", "raíz_perfil/properties/wsjaas_client.conf ");
    2. Obtenga el identificador de la señal SAML creada.
      Utilice la siguiente sentencia como prueba simple para la señal SAML que ha creado:
      System.out.println("SAMLToken id = " + samlToken.getId())

Resultados

Ha solicitado una señal SAML con el método de confirmación sender-vouches de un STS externo. Tras obtener la señal, envíe la señal con mensajes de solicitud de servicios web utilizando la protección de transporte mediante el modelo de programación JAX-WS y las API de WSS.

Ejemplo

El código de ejemplo siguiente es una aplicación de cliente de servicios web completa y lista para utilizar que muestra cómo solicitar una señal SAML de un STS externo y enviar dicha señal SAML en los mensajes de solicitud de servicios web con la protección de nivel de transporte. Este código de ejemplo ilustra los pasos del procedimiento descrito anteriormente.

/**
 * El código fuente siguiente es código de ejemplo creado por IBM Corporation.  
 * Este código de ejemplo se proporciona exclusivamente como ayuda para utilizar  
 * la tecnología.  El código se proporciona 'TAL CUAL', sin garantía ni condición de 
 * ningún tipo.  IBM no se hará responsable de los daños derivados del uso del 
 * código de ejemplo, aunque IBM haya advertido de la posibilidad de tales daños.
 */
package com.ibm.was.wssample.sei.cli;

import com.ibm.was.wssample.sei.echo.EchoService12PortProxy;
import com.ibm.was.wssample.sei.echo.EchoStringInput;

import com.ibm.websphere.wssecurity.wssapi.WSSFactory;
import com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext;
import com.ibm.websphere.wssecurity.wssapi.WSSConsumingContext;
import com.ibm.websphere.wssecurity.wssapi.WSSTimestamp;
import com.ibm.websphere.wssecurity.callbackhandler.SAMLGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.callbackhandler.UNTGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
import com.ibm.websphere.wssecurity.wssapi.token.SAMLToken;
import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants;
import com.ibm.wsspi.wssecurity.saml.config.SamlConstants;

import java.util.Map;
import java.util.HashMap;

import javax.xml.ws.BindingProvider;

public class SampleSamlSVClient {
	private String urlHost = "localhost";
	private String urlPort = "9443";
	private static final String CONTEXT_BASE = "/WSSampleSei/";
	private static final String ECHO_CONTEXT12 = CONTEXT_BASE+"EchoService12";	
	private String message = "HELLO";
	private String uriString = "https://" + urlHost + ":" + urlPort;
	private String endpointURL = uriString + ECHO_CONTEXT12;
	private String input = message;

	/**
	 * main()
	 * 
	 * consulte printusage() para conocer los argumentos de línea de mandatos
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		SampleSamlSVClient sample = new SampleSamlSVClient();
		sample.CallService();
	}

	/**
	 * Los CallService Parms ya se han leído. Ahora se debe llamar a las clases de proxy de servicio. 
	 * 
	 */
	void CallService() {
		String response = "ERROR!:";
		         try {
						
         System.setProperty("com.ibm.SSL.ConfigURL", "raíz_perfil//properties/ssl.client.props");
         System.setProperty("java.security.auth.login.config", "raíz_perfil/properties/wsjaas_client.conf ");
			

//Solicitar la señal SAML desde un STS externo
WSSFactory factory = WSSFactory.getInstance();
String STS_URI  = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
WSSConsumingContext concont1 = factory.newWSSConsumingContext(); 
HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML11_VALUE_TYPE);
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");

SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);

// Añadir UNT a solicitud de confianza
UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);

gencont1.add(ut);

cbHandler1.setWSSConsumingContextForTrustClient(concont1);
cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");

System.out.println("SAMLToken id = " + samlToken.getId()); 

			
	        // Inicializar cliente de servicios web
			EchoService12PortProxy echo = new EchoService12PortProxy();
			echo._getDescriptor().setEndpoint(endpointURL);

			// Configurar propiedades SOAPAction 
			BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
			Map<String, Object> requestContext = bp.getRequestContext();
			requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
			requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY,	Boolean.TRUE);
			requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");
			
			// Inicializar WSSGenerationContext
			WSSGenerationContext gencont = factory.newWSSGenerationContext();
	        gencont.add(samlToken);
	        
	        
	        // Añadir indicación de fecha y hora
	        WSSTimestamp timestamp = factory.newWSSTimestamp();
			gencont.add(timestamp);
	        
	        gencont.process(requestContext);
	        
	        // Crear el objeto de entrada
			EchoStringInput echoParm = 
				new com.ibm.was.wssample.sei.echo.ObjectFactory().createEchoStringInput();
			echoParm.setEchoInput(input);
			System.out.println(">> CLIENT: SEI Echo to " + endpointURL);		
			
			// Preparar para la consumición de indicación de fecha y hora en mensaje de respuesta
				  WSSConsumingContext concont = factory.newWSSConsumingContext();
	     	concont.add(WSSConsumingContext.TIMESTAMP); 
	     	concont.process(requestContext);
	     	
			// Llamar al servicio
			response = echo.echoOperation(echoParm).getEchoResponse();
						
			System.out.println(">> CLIENT: SEI Echo invocation complete.");
			System.out.println(">> CLIENT: SEI Echo response is: " + response);
		} catch(Exception e) {
			System.out.println(">> CLIENT: ERROR: SEI Echo EXCEPTION.");
			e.printStackTrace();
	    }
	}
}
Cuando este ejemplo de aplicación de cliente de servicios web se ejecute correctamente, recibirá mensajes como los siguientes:
SAMLToken id = _6CDDF0DBF91C044D211271166233407
Recuperando documento en 'file:raíz_perfil/.../wsdl/'.
>> CLIENT: SEI Echo to http://localhost:9443/WSSampleSei/EchoService12
>> CLIENT: SEI Echo invocation complete.
>> CLIENT: SEI Echo response is: SOAP12==>>HELLO

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_configsamlsendervouches_transportlevel_requeststs
File name: twbs_configsamlsendervouches_transportlevel_requeststs.html