Pregunta

Tengo que llamar a un servicio web escrito en .RED de Java.El servicio web implementa el WS-Security pila (ya sea WSE 2 o WSE 3, no está claro a partir de la información que yo tengo).

La información que recibí del proveedor de servicios incluidos WSDL, policyCache.archivo de configuración, algunos ejemplos de código de C#, y una aplicación de ejemplo que puede llamar correctamente el servicio.

Esto no es tan útil como parece, porque no está claro cómo se supone que voy a utilizar esta información para escribir un cliente en Java.Si la solicitud de servicio web no está firmada, de acuerdo a la política de entonces es rechazada por el servicio.Estoy tratando de utilizar Apache Axis2 y no puedo encontrar las instrucciones sobre cómo debo utilizar el policyCahce.archivo de configuración y el WSDL para generar un cliente.

Hay varios ejemplos que he encontrado en la Web, pero en todos los casos los autores de los ejemplos que tenía el control del servicio y el cliente, y así fueron capaces de hacer ajustes en ambos lados con el fin de conseguir que funcione.Yo no estoy en esa posición.

Alguien ha hecho esto correctamente?

¿Fue útil?

Solución 2

Esta parece ser una pregunta popular, así que voy a dar un resumen de lo que hicimos en nuestra situación.

Parece que los servicios integrados .NET están siguiendo una antigua ws-addressing estándar (http://schemas.xmlsoap.org/ws/2004/03/addressing/) y axis2 sólo entiende el estándar más reciente (http://schemas.xmlsoap.org/ws/2004/08/addressing/).

Además, el policyCache.archivo de configuración proporcionada en una forma que el axis2 muralla módulo no puede comprender.

Así que los pasos que teníamos que hacer, en una palabra:

  • Leer el policyCache.config y tratar de entenderlo.A continuación, volver a escribir en una política que rampart podía entender.(Algunos se han actualizado los documentos ayudó.)
  • Configurar la muralla con esta política.
  • Tome las llaves que se proporcionaron en el .archivo pfx y convertirlos en java almacén de claves.Hay una utilidad que viene con Jetty que puede hacer eso.
  • Configurar la muralla con la clave de la tienda.
  • Escribir una costumbre axis2 controlador hacia atrás-convierte el más reciente de ws-addressing cosas que viene de axis2 en las cosas viejas espera por el servicio.
  • Configurar axis2 para utilizar el controlador en los mensajes salientes.

Al final fue una gran cantidad de la configuración y el código para algo que se supone debe ser un estándar abierto, apoyado por los vendedores.

Aunque no estoy seguro de lo que la alternativa es...se puede esperar para los vendedores (o, en este caso, el proveedor) para asegurarse de que todo se inter-op?

Como posdata, voy a añadir que no me terminan haciendo el trabajo, era alguien más en mi equipo, pero creo que tengo los aspectos más destacados correcta.La otra opción que yo estaba considerando (antes de que mi compañero de equipo asumió) fue a llamar a la WSS4J API directamente para la construcción de la envoltura SOAP como el .NET servicio que se espera de él.Creo que habría trabajado demasiado.

Otros consejos

WS-especificaciones de Seguridad en general no están contenidas en un WSDL (nunca en un WSE WSDL).Así wsdl2java no sabe que WS-Security es necesario incluso para este servicio.El hecho de que las restricciones de seguridad no están presentes en una WSE WSDL es una gran decepción para mí (WCF incluirá WS-Trust información en un WSDL).

En el cliente final, tendrás que usar Rampart para agregar la necesaria WS-Security de los encabezados de los mensajes de los clientes.Desde el WSDL no informan de lo que WS-configuración de Seguridad son necesarias, es mejor que por pedir al proveedor de servicios lo que se requiere.WS-requisitos de Seguridad puede ser simple texto de contraseña, o podría ser certificados X509, o podría ser un mensaje cifrado.....La muralla debe ser capaz de manejar la mayoría de estos escenarios.

Apache Defensa está "activada" por la participación del módulo en su axis2.xml archivo.Tendrás que descargar de la Muralla módulo y lo puso en un lugar específico en su axis2 directorio, luego de modificar el archivo xml.Usted también puede participar la Muralla a través de programación (por favor, edita tu pregunta original, si este es un requisito y voy a editar esta respuesta).

Dependiendo de cómo se configure la muralla (a través de otros archivos XML o a través de programación), va a interceptar todos los mensajes salientes y añade el WS-Seguridad de la información.Yo personalmente he utilizado axis2 con la muralla para llamar a un WSE3 servicio que está protegido con UsernameToken en texto plano y funcionó muy bien.Similar, pero en escenarios más avanzados también debería funcionar.Hay más detalles sobre cómo configurar y empezar con la Muralla en el sitio enlazado más arriba.Si usted tiene problemas acerca de los detalles de la Muralla o de cómo utilizar la Muralla con su particular WSE de instalación, a continuación, editar tu pregunta, y voy a intentar mi mejor esfuerzo para responder.

@Mike

Hace poco hice una prueba y este es el código que he usado.Yo no estoy usando cosas de la política, pero he usado WS-Security con autenticación de texto sin formato.CXF tiene muy buena documentación sobre cómo lograr esto.

He utilizado wsdl2java y, a continuación, añade este código a utilizar el servicio web con ws-security.

Espero que esto le ayuda a cabo.

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSPasswordCallback;
import org.apache.ws.security.handler.WSHandlerConstants;

public class ServiceTest implements CallbackHandler
{

     public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {

            WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
            // set the password for our message.
            pc.setPassword("buddah");
        }

    public static void main(String[] args){
        PatientServiceImplService locator = new PatientServiceImplService();
        PatientService service = locator.getPatientServiceImplPort();

        org.apache.cxf.endpoint.Client client = org.apache.cxf.frontend.ClientProxy.getClient(service);
        org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint();

        Map<String, Object> outProps = new HashMap<String, Object>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN + " " +  WSHandlerConstants.TIMESTAMP);
        outProps.put(WSHandlerConstants.USER, "joe");
        outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);

        // Callback used to retrieve password for given user.
        outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, ServiceTest.class.getName());

        WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
        cxfEndpoint.getOutInterceptors().add(wssOut);


        try
        {
            List list = service.getInpatientCensus();
            for(Patient p : list){
                System.out.println(p.getFirstName() + " " + p.getLastName());
            }

        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

CXF - Me gustaría mirar en CXF.Lo he utilizado para crear un servicio web y un cliente en java utilizando ws-secuirty.Yo también conectado .web de la red de servicio a la misma.

Tienen muy buena documentación.Tuve más suerte con lo de eje.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top