Puede solicitar señales SAML con el método de confirmación de sujeto de portador de un servicio de señales de seguridad (STS) externo. Después de obtener la señal de portador SAML, puede enviar esas señales con mensajes de solicitud de servicios web utilizando el modelo de programación de la API Java™ para servicios web basados en XML (JAX-WS) y las API de seguridad de servicios web (API de WSS).
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
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 portador 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.
El cliente
de aplicaciones 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.
Los fragmentos de código del ejemplo se describen en el apartado
sobre procedimiento, aunque se proporciona un ejemplo de cliente de servicios
Web completo y listo para utilizarse en el apartado de ejemplo.
Procedimiento
- 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 SAML en los mensajes de solicitud SOAP mediante
programación con las API de WSS, siga estos pasos:
- Descargue la aplicación de ejemplo JaxWSServicesSamples. El ejemplo JaxWSServicesSamples no está instalado de forma predeterminada.
- 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.
- 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.
- Adjunte el conjunto de políticas predeterminado SAML20
Bearer WSHTTPS al proveedor de servicios web. Este conjunto de políticas se utiliza para proteger los
mensajes mediante transporte HTTPS. Consulte la información sobre
la configuración de enlaces de cliente y proveedor para la señal SAML bearer
para obtener detalles sobre cómo adjuntar el conjunto de políticas predeterminado
SAML20 Bearer WSHTTPS al proveedor de servicios web.
- Asigne los enlaces generales predeterminados del ejemplo SAML
Bearer Provider al proveedor de servicios web. Consulte la información sobre configuración de enlaces de cliente
y proveedor para la señal SAML bearer a fin de obtener detalles sobre la
asignación de los enlaces generales predeterminados del ejemplo SAML Bearer Provider
a la aplicación de servicios web.
- Compruebe que las propiedades personalizadas trustStoreType, trustStorePassword y trustStorePath se corresponden con el almacén de confianza que contiene el certificado de firmante STS. Mediante la consola administrativa, complete los pasos siguientes:
- Pulse .
- Pulse gen_saml11token en la tabla
Señales de autenticación.
- Pulse Manejador de retorno de llamada.
- En la sección Propiedades personalizadas, compruebe que las propiedades personalizadas trustStoreType, trustStorePassword y trustStorePath se corresponden con el almacén de confianza que contiene el certificado de firmante STS.
- Solicite la señal SAML de un STS externo. El fragmento de código siguiente ilustra cómo solicitar la señal SAML y presupone que un STS externo esté configurado para aceptar un UsernameToken, y para emitir una señal SAML 2.0 después de la 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.SAML20_VALUE_TYPE);
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "Bearer");
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());
- 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.
- Utilice el método WSSFactory newSecurityToken para solicitar una señal SAML desde un STS externo.
Especifique el método siguiente para solicitar 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 SAML 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 bearer.Propiedad |
Descripción |
Required |
SamlConstants.CONFIRMATION_METHOD |
Especifica que se utiliza el método
de confirmación Bearer. |
Sí |
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 2.0; sin embargo,
también puede utilizar el valor WSSConstants.SAML.SAML11_VALUE_TYPE.
|
Sí |
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.
|
Sí |
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. |
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 ");
- 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())
- Añada la señal SAML a la cabecera de seguridad SOAP de los mensajes de solicitud de servicios web.
- Inicialice el cliente de servicios web y configure las propiedades SOAPAction. El fragmento de código siguiente ilustra estas acciones:
// 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");
- Inicialice WSSGenerationContext. El siguiente fragmento de código ilustra el uso de la interfaz WSSGenerationContext para inicializar un contexto
de generación y que pueda insertar la SAMLToken en un mensaje de solicitud de servicios web:
// Inicializar WSSGenerationContext
WSSGenerationContext gencont = factory.newWSSGenerationContext();
gencont.add(samlToken);
Concretamente, la llamada al método
gencont.add(samlToken)
especifica que se coloque la señal SAML en un mensaje de solicitud. Utilice la herramienta de política 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 javax.security.auth.AuthPermission "modifyPrivateCredentials"
- Añada el elemento timestamp en la cabecera de seguridad de mensajes SOAP. El conjunto de políticas predeterminado SAML20 Bearer WSHTTPS exige solicitudes
de servicios web y mensajes de respuesta para transportar un elemento timestamp en
la cabecera de seguridad de mensajes SOAP. En el siguiente fragmento de código, el
método factory.newWSSTimestamp() genera la indicación de fecha y hora
y la llamada de método gencont.add(timestamp) especifica la indicación de fecha y
hora que se debe colocar en un mensaje de solicitud:
// Añadir una indicación de fecha y hora al mensaje de solicitud.
WSSTimestamp timestamp = factory.newWSSTimestamp();
gencont.add(timestamp);
gencont.process(requestContext);
- Adjunte el objeto WSSGenerationContext al objeto RequestContext de servicios Web. El objeto WSSGenerationContext ahora contiene toda la información de
seguridad necesaria para dar formato a un mensaje de solicitud. La llamada al
método gencont.process(requestContext) adjunta el objeto WSSGenerationContext
al objeto RequestContext de servicios Web para permitir que el entorno de ejecución de seguridad
de servicios Web dé formato a la cabecera de seguridad SOAP necesaria; por ejemplo:
// Adjunta el objeto WSSGenerationContext al objeto RequestContext de servicios Web.
gencont.process(requestContext);
- Especifique la protección de mensajes de nivel de transporte SSL utilizando propiedades de JVM.
El conjunto de políticas predeterminado SAML20 Bearer WSHTTPS exige la protección de mensajes de nivel
de transporte mediante SSL. Además, puede utilizar esta misma propiedad para habilitar la protección de la solicitud de señal SAML en el STS utilizando SSL. Especifique la protección de mensajes de nivel de transporte utilizando la
propiedad de JVM siguiente:
-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");
Resultados
Ha solicitado una señal SAML con el método de confirmación de sujeto de portador con la protección de nivel de transporte desde un STS externo. Tras obtener la señal, envíe la señal con mensajes de solicitud de servicios web utilizando el modelo de programación JAX-WS y las API de WSS.
Si desea solicitar una señal SAML con el método de confirmación de sujeto de portador con la protección de nivel de mensaje desde un STS externo, consulte la documentación para solicitar señales sender-vouches SAML desde un STS externo utilizando las API de WSS y la protección de nivel de mensaje. Para utilizar la protección de nivel de mensaje para señales de SAML con el método de confirmación de sujeto de portador, en el paso para solicitar la señal SAML de un STS externo, especifique un método de confirmación
Portador en lugar de
sender-vouches; por ejemplo:
//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, "Bearer");
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());
Además, el paso para configurar la verificación de la firma digital en el mensaje de respuesta es opcional en el caso de la señal de portador.
Ejemplo
El código de ejemplo siguiente es una aplicación de cliente de servicios web 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. Si su situación de uso exige señales SAML, pero no exige que la aplicación pase señales SAML
utilizando mensajes de servicios web, sólo tiene que utilizar la primera parte del código de ejemplo
siguiente, hasta la sección // Inicializar cliente de servicios web.
/**
* 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;
/**
* Punto de entrada principal de
* punto de entrada principal de ejemplo JAR de cliente ligero
* y clase de trabajo para comunicarse con los servicios
*/
public class SampleClient {
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) {
SampleClient sample = new SampleClient();
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("java.security.auth.login.config", "raíz_perfil/properties/wsjaas_client.conf ");
System.setProperty("com.ibm.SSL.ConfigURL", "file:raíz_perfil/properties/ssl.client.props");
//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.SAML20_VALUE_TYPE);
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "Bearer");
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 = _191EBC44865015D9AB1270745072344
Recuperando documento en 'file:raíz_perfil/.../wsdl/'.
>> CLIENT: SEI Echo to https://localhost:9443/WSSampleSei/EchoService12
>> CLIENT: SEI Echo invocation complete.
>> CLIENT: SEI Echo response is: SOAP12==>>HELLO