Firmar WebServices Axis Con WSS4J y certificados X509
por jnavarretesanchez
El otro día en el trabajo tuve que llamar a un servicio web pero con la peculiaridad de que tenia que estar firmado con un certificado X.509.
Primero voy a poner las posibilidades que barajamos, probamos con varios clientes:
- Axis2 tiene un modulo llamado rampart que pinta bastante bien y tiene varios ejemplos.
- Apache CXF la evolución de Xfire también parece que se integra con Wss4j
- Axis ( lo que tuvo retuvo ) con Wss4j, este fue el primero que probé y también el primero que funciono, así que fue con el que me quede.
Si estas empezando con esto de los servicios web con java te recomiendo estos dos libros: uno sobre Axis y otro sobre Axis2 y CXF, por 15 euretes cada uno no esta mal y son de calidad.
A lo que íbamos, para crear el cliente Axis utilizamos el generador de eclipse
New >> Java Project , lo creamos y luego botón derecho en el proyecto New >> Other >> Web Service Client
- En service definition metemos la url del wsdl,
- Server puede quedar vacío
- Web Service Runtime Axis
- y el client project el que aparece por defecto ( nuestro nuevo proyecto ), siguiente, siguiente y acabamos.
Esto nos ha generado las clases del modelo y luego 5 clases que son:
- NombreDelServicioWS.java
- NombreDelServicioWSHttpBindingStub.java
- NombreDelServicioWSLocator.java
- NombreDelServicioWSPortType.java
- NombreDelServicioWSPortTypeProxy.java
Solo nos interesa la clase NombreDelServicioWSHttpBindingStub.java, veremos que por cada método del servicio se a creado un método con ese nombre y parámetros necesarios. La parte que tenemos que buscar es en la cual se crea el Call ( sera algo tal que así )
org.apache.axis.client.Call _call = createCall(); _call.setOperation(_operations[0]); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
Veremos que cuando termina de setear parámetros al Call llama al invoke. Pues antes de que llame al invoke nosotros tenemos que setear un RequestHandler, y para que?, pues para que firme la petición, que es para lo que te estas tragando el rollaco este.
Entonces la cosa quedaría tal que así:
org.apache.axis.client.Call _call = createCall(); _call.setOperation(_operations[0]); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS); _call.setOperationName(new javax.xml.namespace.QName(NAMESPACE, "NombreDelMetodo")); try { Properties configuration = new Properties(); configuration.load(new FileInputStream(new File("securityConfiguration.properties"))); // Creacion del manejador que securizara la peticion ClientHandler sender = new ClientHandler(configuration); _call.setClientHandlers(sender, null); } catch (Exception e) { e.printStackTrace(); } setRequestHeaders(_call); setAttachments(_call); try { java.lang.Object _resp = _call.invoke(new java.lang.Object[] { numeroPedido, fechaDesde, fechaHasta, estado, cifInvocante, sociedades });
He visto algun sitio donde utilizaban el Handler org.apache.ws.axis.security.WSDoAllSender ( como por ejemplo uno de los libros que he puesto arriba), con el que luego tienes que setear varios parámetros al call, pero a mi no me ha funcionado con el certificado pfx.
Solo queda dejar el ClientHandler y el properties.
ClientHandler.java
package webservices; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.Properties; import javax.xml.soap.SOAPMessage; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.axis.AxisFault; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.SOAPPart; import org.apache.axis.handlers.BasicHandler; import org.apache.axis.message.SOAPEnvelope; import org.apache.ws.security.WSConstants; import org.apache.ws.security.components.crypto.Crypto; import org.apache.ws.security.components.crypto.CryptoFactory; import org.apache.ws.security.message.WSSecHeader; import org.apache.ws.security.message.WSSecSignature; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Clase encargada de securizar los mensajes SOAP de petición realizados desde * un cliente. * * @author SEPAOT * */ public class ClientHandler extends BasicHandler { private static final long serialVersionUID = 1L; // Opciones de seguridad // Localización del keystore con certificado y clave privada de usuario private String keystoreLocation = null; // Tipo de keystore private String keystoreType = null; // Clave del keystore private String keystorePassword = null; // Alias del certificado usado para firmar el tag soapBody de la petición y // que será alojado en el token BinarySecurityToken private String keystoreCertAlias = null; // Password del certificado usado para firmar el tag soapBody de la petición // y que será alojado en el token BinarySecurityToken private String keystoreCertPassword = null; /** * Constructor que inicializa el atributo securityOption * * @param securityOption * opción de seguridad. * @throws Exception */ public ClientHandler(Properties config) { if (config == null) { System.err.println("Fichero de configuracion de propiedades nulo"); System.exit(-1); } try { keystoreLocation = config.getProperty("security.keystore.location"); keystoreType = config.getProperty("security.keystore.type"); keystorePassword = config.getProperty("security.keystore.password"); keystoreCertAlias = config.getProperty("security.keystore.cert.alias"); keystoreCertPassword = config.getProperty("security.keystore.cert.password"); } catch (Exception e) { System.err.println("Error leyendo el fichero de configuración de securización"); System.exit(-1); } } public void invoke(MessageContext msgContext) throws AxisFault { SOAPMessage secMsg = null; try { ((SOAPPart) msgContext.getRequestMessage().getSOAPPart()).setCurrentMessage(this.createBinarySecurityToken(msgContext), SOAPPart.FORM_SOAPENVELOPE); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(-1); } } /** * Securiza, mediante el tag BinarySecurityToken y firma una petición SOAP * no securizada. * * @param soapEnvelopeRequest * Documento xml que representa la petición SOAP sin securizar. * @return Un mensaje SOAP que contiene la petición SOAP de entrada * securizada mediante el tag BinarySecurityToken. */ private SOAPEnvelope createBinarySecurityToken(MessageContext msgContext) { ByteArrayOutputStream baos; Crypto crypto; Document secSOAPReqDoc,soapEnvelopeRequest; DOMSource source; Element element; StreamResult streamResult; String secSOAPReq; WSSecSignature wsSecSignature; WSSecHeader wsSecHeader; SOAPMessage msg; try { // Obtención del documento XML que representa la petición SOAP msg = msgContext.getCurrentMessage(); soapEnvelopeRequest = ((org.apache.axis.message.SOAPEnvelope) msg.getSOAPPart().getEnvelope()).getAsDocument(); // Inserción del tag wsse:Security y BinarySecurityToken wsSecHeader = new WSSecHeader(null, false); wsSecSignature = new WSSecSignature(); crypto = CryptoFactory.getInstance("org.apache.ws.security.components.crypto.Merlin", this.initializateCryptoProperties()); // Indicación para que inserte el tag BinarySecurityToken wsSecSignature.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE); // wsSecSignature.setKeyIdentifierType(WSConstants.ISSUER_SERIAL); wsSecSignature.setUserInfo(this.keystoreCertAlias, this.keystoreCertPassword); wsSecHeader.insertSecurityHeader(soapEnvelopeRequest); wsSecSignature.prepare(soapEnvelopeRequest, crypto, wsSecHeader); // Modificación y firma de la petición secSOAPReqDoc = wsSecSignature.build(soapEnvelopeRequest, crypto, wsSecHeader); element = secSOAPReqDoc.getDocumentElement(); // Transformación del elemento DOM a String source = new DOMSource(element); baos = new ByteArrayOutputStream(); streamResult = new StreamResult(baos); TransformerFactory.newInstance().newTransformer().transform(source, streamResult); secSOAPReq = new String(baos.toByteArray()); // Creación de un nuevo mensaje SOAP a partir del mensaje SOAP // securizado formado Message axisMessage = getAxisMessage(secSOAPReq,msgContext); return axisMessage.getSOAPEnvelope(); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(-1); return null; } } /** * Establece el conjunto de propiedades con el que será inicializado el * gestor criptográfico de WSS4J. * * @return Devuelve el conjunto de propiedades con el que será inicializado * el gestor criptográfico de WSS4J. */ private Properties initializateCryptoProperties() { Properties res = new Properties(); res.setProperty("org.apache.ws.security.crypto.provider", "org.apache.ws.security.components.crypto.Merlin"); res.setProperty("org.apache.ws.security.crypto.merlin.keystore.type", this.keystoreType); res.setProperty("org.apache.ws.security.crypto.merlin.keystore.password", this.keystorePassword); res.setProperty("org.apache.ws.security.crypto.merlin.keystore.alias", this.keystoreCertAlias); res.setProperty("org.apache.ws.security.crypto.merlin.alias.password", this.keystoreCertPassword); res.setProperty("org.apache.ws.security.crypto.merlin.file", this.keystoreLocation); return res; } /** * Creates and returns an Axis message from a SOAP envelope string. * * @param unsignedEnvelope * a string containing a SOAP envelope * @return <code>Message</code> the Axis message */ private Message getAxisMessage(String unsignedEnvelope, MessageContext msgContext) { InputStream inStream = new ByteArrayInputStream(unsignedEnvelope.getBytes()); Message axisMessage = new Message(inStream); axisMessage.setMessageContext(msgContext); return axisMessage; } }
securityConfiguration.properties
############################################################## # SECURIZACIÓN DE PETICIÓN SOAP DEL CLIENTE # ############################################################## # - location: Ruta al almacén que contiene el certificado y la clave privada con la que firmar la petición WS # - type: Tipo de almacén (PKCS12, JKS) # - password: password del Almacén # - cert alias: Alias del certificado del usuario que está dentro del almacén # - cert password: Password de la clave privada correspondiente al certificado anterior security.keystore.location=/home/sorack/certificado.pfx security.keystore.type=PKCS12 security.keystore.password=password security.keystore.cert.alias={8aeff3e45fa-65543c-4636-8ff6-5dd8453e4a0f1b} security.keystore.cert.password=password
La clase ClientHanlder utiliza trozos de código que he vi en este manual
Por ultimo comentar que Wss4j no admite namespaces relativos, el error que da es algo como » element x has a relative namespace»
hola, como va ?
segui tus pasos, paso a paso … estoy teniendo esta exception null, tenes idea que puede ser ?
muchas gracias
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.lang.NullPointerException
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:java.lang.NullPointerException
at org.apache.axis.client.Call.invokeEngine(Call.java:2816)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
{http://xml.apache.org/axis/}hostname:vv
java.lang.NullPointerException
at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
at org.apache.axis.client.Call.invoke(Call.java:2446)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
Caused by: java.lang.NullPointerException
at org.apache.axis.client.Call.invokeEngine(Call.java:2816)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
… 5 more
He seguido los pasos y tengo el mismo problema que Juan, (nullPointer), ¿podrias decirme si lo has solucionado y como?
Gracias
Hola, seguí al pie de la letra los pasos y me funcionó perfectamente.
La unica particularidad que encontre es la siguiente, no se si a vos te sucedio lo mismo:
Al enviar el mensaje firmado, este se envia sin los namespaces, estos viajan vacios xmls=»».
Al quitarle la firma al mensaje, los namespaces viajan con lo que le setee en Qname.
Sabes si es un bug del Axis (estoy usando el 1.4)? Saludos y gracias. Muy buenos los post.
Hola,
Tengo el mismo problema que Nicolas, ¿alguien sabe las razones por las que eso sucede?
Muchas gracias!
Tengo el mismo problema que los compañeros Alberto y Nicolas ¿Alquien lo ha resuelto?, gracias.
El error que me da es «WSEC3047E No se puede deserializar el elemento»
P.D. El articulo es genial, nos a resuelto muchos problemas.
Gracias por todo.
Hola Fernando,
Te comento mi experiencia por si te puede servir de ayuda:
En el wsdl se le estaba indicando a la operacion el parametro encodingStyle, pero al utilizar la herramienta wsdl2java para generar el cliente a partir de el wsdl estaba ignorando este parámetro.
En el Stub que me generaba me estaba poniendo esta línea:
_call.setEncodingStyle(null);
Esta linea la modifique poniendo:
_call.setEncodingStyle(«http://elEncodingStyleEsperado»);
Por otro lado, al utilizar un handler para firmar la peticion (yo he utilizado WSDoAllSender), axis establecía por defecto el «Use» de la petición a Encoded y yo necesitaba «LITERAL».
Para esto cree un SOAPService que le paso como parámetro al objeto Call.
Es decir, en un principio establecia el handler del siguiente modo:
call.setClientHandlers(new WSDoAllSender(), new WSDoAllReceiver());
Y ahora se establece así:
SOAPService soapService=new SOAPService(new WSDoAllSender(), null, new WSDoAllReceiver());
soapService.setUse(org.apache.axis.constants.Use.LITERAL);
call.setSOAPService(soapService);
Espero os pueda servir de ayuda!
Hola Alberto, gracias por la información, me está sirviendo, pero estoy intentando utilizar el manejador WSDoAllReceiver() y no doy con la tecla ¿podrias pasarme el codigo de esta clase? Gracias.
mi correo es fcastroruiz(arroba)yahoo(punto)es
Hola Fernando,
En este caso no te puedo ayudar. Finalmente no he utilizado WSDoAllReceiver() ya que la petición de respuesta del webservice no viene firmada.
De todos modos, este manejador es una clase propia de axis (de seguridad), por lo que si te bajas el codigo fuente de la web de apache de la libreria wss4j.jar lo encontrarás.
Espero haberte ayudado un poco…
Gracias Alberto!. No he puesto nada porque llevo sin tocar una linea de código seis meses. Pero veo que todavía gente dándole duro.
Suerte!
Bueno, olvidaros de todo lo que puse en el anterior comentario.
Esta es la solución final adoptada para el problema que yo tenía.
En lugar de utilizar la linea:
call.setClientHandlers(new WSDoAllSender(), new WSDoAllReceiver());
He utilizado las siguientes:
SOAPService soapService=new SOAPService(new WSDoAllSender(), null, null);
soapService.setUse(org.apache.axis.constants.Use.LITERAL);
soapService.getServiceDescription().setTypeMapping(call.getTypeMapping());
soapService.getTypeMappingRegistry().register(«», call.getTypeMapping());
call.setSOAPService(soapService);
Un saludo,
Infinitas gracias por vuestra ayuda, a mi me ha funcionado tambien correctamente, despues de dos semanas sin parar.
!!Os debo una copa!!
Gracias Alberto!!! No te puedes imaginar lo que te adoro!!! Nota mental para el que lo vea, para los que no cambiaron el nombre de las funciones, tu WSDoAllSender() = ClientHandler()
Hola!
Me resulto muy útil tu explicación, muchas gracias!
En mi caso me esta pasando algo muy extraño, te cuento por si me podes dar alguna idea o sugerencia que me pueda ayudar 🙂
Yo también tengo un certificado .pfx, seguí todos los pasos y cuando miro el xml que se envía al webservice esta encriptado.
El problema es que el servidor iis donde están publicados los webservices a consumir me dice «error 403 acceso denegado falta el certificado».
Por otro lado el certificado pfx es el correcto ya que sin el no puedo entrar por internet explorer para ver la definición del servicio (cuando lo agrego al navegador me permite acceder a dicha definición)
Que te parece que me podría estar faltando?, se que no te estoy dando muchos datos y seguramente pueden ser millones de cosas, pero llevo tiempo investigando y estoy trancada.
Un detalle mas, para poder ver la definición del servicio ademas del certificado tengo que usar usuario y contraseña, si bien en el código los pongo no se si esto pueda afectar 😛 , en si el error es de que falta un certificado
Saludos y muchas gracias!
Hola,
¿El código que utilizas para utilizar el certificado es el que está en el ejemplo de arriba?
¿Donde y como estás estableciendo el usuario y contraseña?
Si hice lo mismo que este tutorial.
El codigo donde coloco el usuario y la contraseña es el siguiente:
((Stub) stub)._setProperty(Call.USERNAME_PROPERTY, «usuario»);
((Stub) stub)._setProperty(Call.PASSWORD_PROPERTY, «contraseña»);
Gracias!!
Se me ocurre una cosa, ¿puede ser que el certificado que deberías utilizar no esté importado (mediante keytool o similar) en el keystore?
Hola! 😀
En el código tengo el pfx (como en el ejemplo) que tiene el certificado que necesito para ingresar al sitio (identificarme), creo que anda bien por que hice la prueba con el navegador, si no lo tengo agregado no puedo ingresar una vez instalado en el navegador puedo acceder.
Por otro lado, también tengo un keystore donde coloque el certificado de la pagina de ellos como trustStore mio.
Solo tengo una duda, (perdón por mi ignorancia en el tema 😛 ) mirando el xml que envio, veo que en el header la cosas como «KeyInfo» y la encriptacion, pero no en el body, puede ser que tambien hay que usar algo por el estilo en el body??
Otra cosa mas también vi que a veces hay en el código una consulta por securityOption = config.getProperty(«security.mode»);
Yo me fije que en mi código para dicha propiedad tengo null, puede ser que esto tenga algo que ver?
Saludos!!
Puedes poner del XML, las cabeceras que estás enviando?
Hola!!! gracias x toda la ayuda!!
Recién ahora lo pude hacer andar te cuento lo que hice:
En la clase main donde llamo al webservice agregue este codigo:
System.setProperty(«javax.net.ssl.keyStore», «ruta_al_keyStore/keystore.jks»);
System.setProperty(«javax.net.ssl.keyStorePassword», «clave»);
System.setProperty(«javax.net.ssl.keyStoreType», «PKCS12»);
System.setProperty(«javax.net.ssl.trustStore», «ruta_truststore/trusstore.jks»);
System.setProperty(«javax.net.ssl.trustStorePassword», «pass»);
System.setProperty(«com.sun.net.ssl.dhKeyExchangeFix», «true»);
GRACIAS POR TODO 😀 !!!!!!!!!!!!!!!!
Vale.. no me había fijado que esas lineas no estaban en el ejemplo. Yo también tuve que ponerlas. Me alegro que ya te haya funcionado 😀
😉
Esto es un equivalente a configurar en el WAS la parte de seguridad el puerto y el ip del servicio web? yo lo hice así pero en la empresa donde laburo me indican que esa configuracion no debe ser necesaria, entonces no se como hacerlo porque el servicio web al invocarlo me sale un error de SSL, salvo que se salte este paso o no utilice la seguridad pero no se como hacerlo, agradecería mucho sus comentarios, gracias
¿Que version de Wss4j estas usando? me puedes pasar el .jar? Gracias
hola buenas eh seguido el ejemplo y me sale el siguiente error me gustaria saber como puedo solucionar esto:
General security error (No certificates for user {le-2403e6a9-688b-41b9-884b-d0ab2fc54a10} were found for signature)
Por si os sirve de algo, he conseguido firmar sin tocar nada en el codigo java que se genera automáticamente, disculpad si he tardado en contestar pero es que he estado de vacaciones, puede que algo falle porque he ido modificando codigo conforme escribia si detectais algo ponedlo para que los demas puedan usarlo, os explico como lo he hecho:
URL url = new URL(locator.getServiceDispatcherAddress());
EngineConfiguration config = new FileProvider(«cliente.wsdd»);
ServiceDispatcherServiceLocator locator = new ServiceDispatcherServiceLocator(config);
ServiceDispatcherSoapBindingStub stub = new ServiceDispatcherSoapBindingStub(url, locator);
[Aqui ponemos el codigo para rellenar los parametros que nos pida el stub]
SERVICE_RESPONSE res = stub.process(parametros);
Anexo a este codigo tendriamos que tener un fichero cliente.wsdd como esto:
<!– –>
<!– –>
<!– –>
<!– –>
<!– –>
<!– –>
<!– –>
En el cliente.wsdd se hace referencia a dos ficheros PWCallback.java y securityConfiguration.properties:
securityConfiguration.properties es como os pongo aqui:
org.apache.ws.security.crypto.merlin.file=Almacen.jks
org.apache.ws.security.crypto.merlin.keystore.type=JKS
org.apache.ws.security.crypto.merlin.keystore.password=prueba
PWCallback.java es como os pongo aqui:
package nuestropaquete;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;
public class PWCallback implements CallbackHandler {
// private static final byte[] key = {
// (byte)0x31, …
// };
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof WSPasswordCallback) {
WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
/*
* here call a function/method to lookup the password for
* the given identifier (e.g. a user name or keystore alias)
* e.g.: pc.setPassword(passStore.getPassword(pc.getIdentfifier))
* for testing we supply a fixed name/fixed key here.
*/
// if (pc.getUsage() == WSPasswordCallback.KEY_NAME) {
// pc.setKey(key);
// }
// else {
pc.setPassword("prueba");
// }
} else {
throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback");
}
}
}
}
Cliente.wsdd, último intento, el responseFlow no es necesario, se usa para tratar la respuesta del servidor, esta respuesta puede venir firmada y nosotros podemos tratar esta firma y validar que es correcta.
Siento la cantidad de post que he puesto, si el administrador es tan amable de borrarlo mejor, como digo en el post anterior, el responseFlow no es necesario, se usa para tratar la respuesta del servidor, esta respuesta puede venir firmada y nosotros podemos tratar esta firma y validar que es correcta.
Os pongo un link para que tengais el cliente.wsdd
http://dl.dropbox.com/u/14707687/cliente.wsdd
Hola
Estoy haciendo alguna prueba con el código que aparece en el post pero tengo una duda. ¿De donde sale o como consigo el valor del Alias que aparece en el fichero de propiedades? no sé donde tengo que mirara para obtener un valor de ese tipo. Estoy desarrollando un cliente para un servicio con seguridad del cual me han mandado un fichero .pfx. ¿Dentro de este fichero está ese valor o tengo que hacer algo con el?
Tampoco tengo claro si tengo que hace algo en el almacen de claves que hay dentro del path de Java en lib\security\cacerts. ¿Tengo que meter el pfx ahí dentro mediante keytool?
Muchas gracias a todos
Hola Oscar…ya sé que hace un buen tiempo de este post, pero estoy exactamente en la situación que describías antes, y con las mismas dudas…este blog me está resultando útil, pero no logro entender si para hacer funcionar el código original, es necesario tener cargado el certificado en el keystore…me gustaría encontrar una manera en la que esto no fuera necesario.
Has encontrado alguna solución tú?
Gracias.
He probado de firmar una peticion soap tanto siguiendo este tutorial como con el WSDoAllSender. Visualizando la petición parece correctamente firmada, pero cuando la envio al servicio web, siempre me devuelve el error: No signature in the WS-Security message for the configured soap actor/role «»!
Alguna pista sobre que puede ser? Estoy desesperado
Hasta donde yo he comprobado (me daba el mismo error) es por el estilo de codificación, prueba a cambiar la línea _call.setEncodingStyle(null); por _call.setEncodingStyle(estilo_de_codificación); donde estilo_de_codificación puede ser para SOAP 1.1 «http://schemas.xmlsoap.org/soap/encoding/» y para SOAP 1.2 «http://www.w3.org/2001/12/»
Espero que te sirva de ayuda…
I would like to take note of this specific blog,
“Firmar WebServices Axis Con WSS4J y certificados X509 Un Beagle y Yo” on my personal website.
Will you mind if I actuallydo it? Thanks a lot ,Brigette
Of course not, go ahead.
Hola, gracias por redactar este post. Estoy trabajando contra un webservice con ws-security. Podrías explicar como esta compuesto el BinarySecurityToken o que función cumple?
Por otro lado, no encuentro manera de poder firmar, el body, timestamp y BinarySecurityToken juntos (es lo que requiere el ws).
Hola, cuáles serían los pasos siguientes para encriptar? Ya están firmados los elementos, pero ahora es necesario encriptarlos, seguimos con los mismos pasos pero ahora con WSSecEncrypt wsSecEncrypt = new WSSecEncrypt(); wsSecEncrypt.build(documento,crypto);
Buenas. Veo que ya hace tiempo de este tutorial. El caso es que he pinchado en los enlaces de los libros que indicas de «Axis» y «Axis2 y Cxf» y el servidor está ya fuera de juego.
Alguien podría indicarme cuales eran los títulos de los libros??. Me parece un tema muy interesante y me gustaría poder agendiármelos.
Muchas gracias por anticipado.