Puede crear señales SAML autoemitidas con el método de confirmación de sujetos sender-vouches y, a continuación, utilizar
la API Java™ para el modelo de programación JAX-WS (XML-Based Web Services) y las API de WSS (Web Services Security), para enviar esas señales con mensajes de solicitud de servicios web con protección de nivel de mensaje.
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 proteger los mensajes de solicitud SOAP y las señales SAML
utilizando la interfaz de programación de los servicios de seguridad Web para
satisfacer los requisitos de validación del método de confirmación de sujetos
sender-vouches con la protección de nivel de mensaje.
La utilización de las
interfaces de programación en el cliente de servicios web es un enfoque alternativo
para utilizar la configuración de conjuntos de políticas y enlaces.
Puede crear una señal SAML autoemitida y, a continuación, enviar la señal
SAML en los mensajes de solicitud de servicios web de un cliente de
servicios web. 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.
Este producto no proporciona un conjunto de políticas predeterminado que
exige señales SAML con el método de confirmación de sujetos
sender-vouches. Consulte la información sobre la configuración de enlaces
de cliente y proveedor para la señal sender-vouches de SAML para obtener más
detalles sobre cómo crear una política de seguridad de servicios Web para
exigir señales SAML con la confirmación de sujetos sender-vouches y cómo crear
una configuración de enlaces personalizados. Debe adjuntar la política y el
enlace al proveedor de servicios web. El ejemplo de código que se describe en
esta tarea presupone que la política de proveedor de servicios web exige que
tanto las señales SAML como los cuerpos de los mensajes se firmen digitalmente
utilizando una señal de seguridad X.509.
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 sender-vouches 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.
- Utilice el método CallService() para especificar los parámetros de configuración
de seguridad de servicios Web que son necesarios para invocar un proveedor de
servicios web de destino utilizando una señal SAML autoemitida.
El método CallService() establece los parámetros de configuración necesarios para el entorno de ejecución
de seguridad de servicios Web mediante la propiedad personalizada com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext
para generar una señal SAML autoemitida.
El siguiente fragmento de código ilustra la utilización del método CallService()
para establecer la propiedad del sistema
SamlConstants.SAML_SELF_ISSUER_CONFIG:
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("java.security.auth.login.config", "raíz_perfil/properties/wsjaas.conf");
Consulte la información sobre cómo configurar una señal SAML durante la creación de señales para obtener más información sobre cómo se pueden especificar las propiedades de
configuración para controlar cómo se configura la señal.
- 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.
- Cree la señal SAML autoemitida. El fragmento de código siguiente ilustra la creación de la señal SAML:
// Crear SAMLToken
HashMap<Object, Object> map = new HashMap<Object, Object>();
map.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
map.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
map.put(SamlConstants.SAML_NAME_IDENTIFIER, "Alice");
map.put(SamlConstants.SIGNATURE_REQUIRED, "true");
SAMLGenerateCallbackHandler callbackHandler = new SAMLGenerateCallbackHandler(map);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml");
System.out.println("SAMLToken id = " + samlToken.getId());
- Utilice el método newSecurityToken de WSSFactory para especificar cómo crear la señal SAML.
Especifique el método siguiente para crear la señal SAML:
WSSFactory newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml")
La creación de una señal SAML exige el permiso de seguridad Java wssapi.SAMLTokenFactory.newSAMLToken. Añada la sentencia de política siguiente al archivo de política de seguridad Java o
al archivo was.policy de cliente de aplicaciones:
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 va a crear. Este objeto apunta a un objeto SAMLGenerateCallbackHandler que especifica los
parámetros de configuración siguientes que se describen en esta tabla:
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. |
Sí |
SamlConstants.TOKEN_TYPE |
Utiliza el valor constante,
WSSConstants.SAML.SAML20_VALUE_TYPE, para especificar
un tipo de señal SAML 2.0.
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. En esta situación
de ejemplo, especifique el tipo de valor de señal mediante el atributo
valueType de la configuración de enlace tokenGenerator.
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.SAML_NAME_IDENTIFIER |
Especifica una identidad de usuario como
puede ser myname como valor de NameID en la señal SAML.
Si no define este parámetro cuando se utiliza el cliente ligero para JAX-WS, el valor de NameID no contiene información útil.
Si va a utilizar un cliente gestionado de servicios web, como una
aplicación Java 2 Platform,
Enterprise Edition (Java) que realice una invocación de solicitud de
servicios web, el entorno de ejecución de servicios Web intenta extraer
la información de seguridad del usuario del contexto de seguridad. De forma similar, si no define este parámetro para un cliente de servicios web gestionado,
el valor de NameID contiene un identificador de nombre UNAUTHENTICATED.
Esta propiedad no se utiliza si el cliente de servicios web tiene adjuntos de conjunto de políticas. Consulte la información sobre cómo enviar señales SAML para obtener más detalles sobre el envío
de la identidad y los atributos de las señales SAML.
|
No |
SamlConstants.SIGNATURE_REQUIRED |
Especifica si el emisor es obligatorio
para firmar digitalmente la señal símbolo SAML.
El valor true
especifica que el emisor es obligatorio para firmar digitalmente la señal SAML.
Este valor es el predeterminado.
|
No |
El parámetro
system.wss.generate.saml especifica que se utiliza una configuración de inicio de sesión Java Authentication
and Authorization Service (JAAS) y especifica el login que se invoca 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.conf
Como alternativa, puede especificar un archivo de configuración de inicio de sesión JAAS que utilice 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.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. Los ejemplos de código siguientes ilustran 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");
// Inicializar WSSGenerationContext
WSSGenerationContext gencont = factory.newWSSGenerationContext();
gencont.add(samlToken);
- Inicialice WSSGenerationContext. El siguiente fragmento de código ilustra el uso del gencont.object
del tipo WSSGenerationContext para inicializar un contexto de generación para
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. Esta operación exige que el código de cliente tenga el siguiente permiso de
seguridad Java 2:
“permission javax.security.auth.AuthPermission "modifyPrivateCredentials"
- Añada una señal X.509 para la protección de mensajes.
Este código de ejemplo utiliza el archivo de claves dsig-sender.ks y la
clave de ejemplo SOAPRequester. No debe utilizar la clave de ejemplo en un entorno
de producción. El siguiente fragmento de código muestra cómo añadir una señal X.509 para la protección del mensaje:
// Añadir una señal X.509 para la protección de mensajes
X509GenerateCallbackHandler x509callbackHandler = new X509GenerateCallbackHandler(
null,
"raíz_perfil/etc/ws-security/samples/dsig-sender.ks",
"JKS",
"client".toCharArray(),
"soaprequester",
"client".toCharArray(),
"CN=SOAPRequester, OU=TRL, O=IBM, ST=Kanagawa, C=JP", null);
SecurityToken x509 = factory.newSecurityToken(X509Token.class,
x509callbackHandler, "system.wss.generate.x509");
WSSSignature sig = factory.newWSSSignature(x509);
sig.setSignatureMethod(WSSSignature.RSA_SHA1);
WSSSignPart sigPart = factory.newWSSSignPart();
sigPart.setSignPart(samlToken);
sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
sig.addSignPart(sigPart);
sig.addSignPart(WSSSignature.BODY);
- Cree un objeto WSSSignature con el símbolo X509. La línea de código siguiente crea un objeto WSSSignature con la señal X509:
WSSSignature sig = factory.newWSSSignature(x509);
- Añada la parte firmada que se debe utilizar para la protección de mensajes. La línea de código siguiente especifica la adición de WSSSignature.BODY como parte firmada:
sig.addSignPart(WSSSignature.BODY);
- Añada el elemento timestamp en la cabecera de seguridad de mensajes SOAP. Los conjuntos de políticas de SAML20 SenderVouches WSHTTPS y SAML11 SenderVouches
WSHTTPS exigen 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, la llamada al método factory.newWSSTimestamp()
genera la indicación de fecha y hora y la llamada al método gencont.add(timestamp)
añade la indicación de fecha y hora al mensaje de solicitud:
// Añadir timestamp
WSSTimestamp timestamp = factory.newWSSTimestamp();
gencont.add(timestamp);
sig.addSignPart(WSSSignature.TIMESTAMP);
gencont.add(sig);
WSSConsumingContext concont = factory.newWSSConsumingContext();
- Configure la verificación de la firma digital en el mensaje de respuesta.
Es necesario una WSSSignPart independiente para especificar el algoritmo de
transformación de SecurityTokenReference que se representa mediante el atributo
WSSSignPart.TRANSFORM_STRT10.
Una señal SAML no se puede firmar
digitalmente de forma directa. Este atributo permite que el entorno de ejecución
de seguridad de servicios Web genere un elemento SecurityTokenReference para referenciar
la señal SAML y firmarla digitalmente con la transformación SecurityTokenReference.
En la línea de código siguiente se especifica la utilización del
atributo
WSSSignPart.TRANSFORM_STRT10:
WSSSignPart sigPart = factory.newWSSSignPart();
sigPart.setSignPart(samlToken);
sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
- 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);
- Utilice la señal X.509 para validar la firma digital y la integridad del mensaje de respuesta. Si la política del proveedor exige que el mensaje de respuesta se firme digitalmente, debe inicializar la señal X.509.
- Un objeto X509ConsumeCallbackHandler se inicializa con un almacén de confianza, dsig-receiver.ks, y un objeto de vía de
acceso de certificado para validar la firma digital del proveedor. La línea siguiente de código se utiliza para inicializar el objeto X509ConsumeCallbackHandler:
X509ConsumeCallbackHandler callbackHandlerVer = new X509ConsumeCallbackHandler(
"profile_root/etc/ws-security/samples/dsig-receiver.ks",
"JKS",
"server".toCharArray(),
certList,
java.security.Security.getProvider("IBMCertPath"));
- Se crea un objeto WSSVerification y el cuerpo del mensaje se añade al objeto de verificación para que el entorno
de ejecución de seguridad de servicios Web valide la firma digital.
La línea siguiente de código se utiliza para inicializar el
objeto WSSVerification:
WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandlerVer);
El objeto WSSConsumingContext ahora contiene toda la información de seguridad necesaria para dar
formato a un mensaje de solicitud. La llamada al método
concont.process(requestContext) adjunta el objeto WSSConsumingContext
al método de respuesta; por ejemplo:
// Adjunta el objeto WSSConsumingContext al objeto RequestContext de servicios web.
concont.process(requestContext);
Resultados
Ha creado una señal SAML autoemitida con el método de confirmación de autorización sender-vouches y, a continuación, ha enviado esta señal con mensajes de solicitud de servicios web utilizando 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 ser utilizada que muestra cómo crear una señal SAML autoemitida sender-vouches y enviar dicha señal SAML en los mensajes de solicitud de servicios web. 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.callbackhandler.SAMLGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.WSSConsumingContext;
import com.ibm.websphere.wssecurity.wssapi.WSSFactory;
import com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext;
import com.ibm.websphere.wssecurity.wssapi.WSSTimestamp;
import com.ibm.websphere.wssecurity.wssapi.token.SAMLToken;
import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
import com.ibm.websphere.wssecurity.callbackhandler.X509ConsumeCallbackHandler;
import com.ibm.websphere.wssecurity.callbackhandler.X509GenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.WSSException;
import com.ibm.websphere.wssecurity.wssapi.signature.WSSSignPart;
import com.ibm.websphere.wssecurity.wssapi.signature.WSSSignature;
import com.ibm.websphere.wssecurity.wssapi.verification.WSSVerification;
import com.ibm.websphere.wssecurity.wssapi.token.X509Token;
import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants;
import com.ibm.wsspi.wssecurity.saml.config.SamlConstants;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.cert.CertStore;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.CollectionCertStoreParameters;
import java.security.cert.X509Certificate;
import java.util.HashSet;
import java.util.Set;
import java.util.HashMap;
import java.util.Map;
import javax.xml.ws.BindingProvider;
public class SampleSamlSVClient {
private String urlHost = "localhost";
private String urlPort = "9081";
private static final String CONTEXT_BASE = "/WSSampleSei/";
private static final String ECHO_CONTEXT12 = CONTEXT_BASE+"EchoService12";
private String message = "HELLO";
private String uriString = "http://" + 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("java.security.auth.login.config", "raíz_perfil/properties/wsjaas.conf");
// Inicializar el objeto WSSFactory
WSSFactory factory = WSSFactory.getInstance();
// Inicializar WSSGenerationContext
WSSGenerationContext gencont = factory.newWSSGenerationContext();
// Inicializar la configuración del emisor de SAML mediante propiedades personalizadas
HashMap<Object, Object> customProps = new HashMap<Object,Object>();
customProps.put(SamlConstants.ISSUER_URI_PROP, "example.com");
customProps.put(SamlConstants.TTL_PROP, "3600000");
customProps.put(SamlConstants.KS_PATH_PROP, "keystores/saml-provider.jceks");
customProps.put(SamlConstants.KS_TYPE_PROP, "JCEKS");
customProps.put(SamlConstants.KS_PW_PROP, "{xor}LCswLTovPiws");
customProps.put(SamlConstants.KEY_ALIAS_PROP, "samlissuer");
customProps.put(SamlConstants.KEY_NAME_PROP, "CN=SAMLIssuer, O=EXAMPLE");
customProps.put(SamlConstants.KEY_PW_PROP, "{xor}NDomLz4sLA==");
customProps.put(SamlConstants.TS_PATH_PROP, "keystores/saml-provider.jceks");
customProps.put(SamlConstants.TS_TYPE_PROP, "JCEKS");
customProps.put(SamlConstants.TS_PW_PROP, "{xor}LCswLTovPiws");
gencont.add(customProps); //Añadir propiedades personalizadas
// Crear SAMLToken
HashMap<Object, Object> map = new HashMap<Object, Object>();
map.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
map.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
map.put(SamlConstants.SAML_NAME_IDENTIFIER, "Alice");
map.put(SamlConstants.SIGNATURE_REQUIRED, "true");
SAMLGenerateCallbackHandler callbackHandler = new SAMLGenerateCallbackHandler(map);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, callbackHandler, "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 señales X.509 para la protección de mensajes
X509GenerateCallbackHandler x509callbackHandler = new X509GenerateCallbackHandler(
null,
"raíz_perfil/etc/ws-security/samples/dsig-sender.ks",
"JKS",
"client".toCharArray(),
"soaprequester",
"client".toCharArray(),
"CN=SOAPRequester, OU=TRL, O=IBM, ST=Kanagawa, C=JP", null);
SecurityToken x509 = factory.newSecurityToken(X509Token.class,
x509callbackHandler, "system.wss.generate.x509");
WSSSignature sig = factory.newWSSSignature(x509);
sig.setSignatureMethod(WSSSignature.RSA_SHA1);
WSSSignPart sigPart = factory.newWSSSignPart();
sigPart.setSignPart(samlToken);
sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
sig.addSignPart(sigPart);
sig.addSignPart(WSSSignature.BODY);
// Añadir indicación de fecha y hora
WSSTimestamp timestamp = factory.newWSSTimestamp();
gencont.add(timestamp);
sig.addSignPart(WSSSignature.TIMESTAMP);
gencont.add(sig);
WSSConsumingContext concont = factory.newWSSConsumingContext();
// Preparar para la consumición de indicación de fecha y hora en mensaje de respuesta
concont.add(WSSConsumingContext.TIMESTAMP);
// Preparar para verificar la firma digital en mensaje de respuesta
X509Certificate x509cert = null;
try {
InputStream is = new FileInputStream("raíz_perfil/etc/ws-security/samples/intca2.cer");
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);
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);
}
X509ConsumeCallbackHandler callbackHandlerVer = new X509ConsumeCallbackHandler(
"raíz_perfil/etc/ws-security/samples/dsig-receiver.ks",
"JKS",
"server".toCharArray(),
certList,
java.security.Security.getProvider("IBMCertPath"));
WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandlerVer);
ver.addRequiredVerifyPart(WSSVerification.BODY);
concont.add(ver);
gencont.process(requestContext);
concont.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);
// 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:9080/WSSampleSei/EchoService12
>> CLIENT: SEI Echo invocation complete.
>> CLIENT: SEI Echo response is: SOAP12==>>HELLO