2012-08-07 29 views
6

Tengo un servicio web que usa autenticación mutua SSL. Puedo acceder muy bien en el navegador cuando tengo el certificado del cliente instalado.¿Cómo usar wsimport cuando el servidor espera el certificado del cliente?

Necesito poder acceder a esto usando wsimport para generar el código de Java para acceder al servicio.

¿Cómo puedo configurar mis credenciales para que pueda acceder a la URL usando wsimport?

Aquí hay un ejemplo de lo que estoy intentando, pero se agota debido a la imposibilidad de autenticarse.

wsimport ./sample.wsdl -p com.company.ws.sample -Xnocompile -d ./src -extension -keep -XadditionalHeaders

Gracias por cualquier ayuda

Editar:

Esto es lo que wsimport impresiones. El WSDL es sin duda válida, y en el lugar determinado, es una cuestión de averiguar cómo pasar en mis credenciales de autenticación:

wsimport https://wsdl.location.com?WSDL -p com.company.ws.sample -Xnocompile 
-d ./src -extension -keep -XadditionalHeaders 


parsing WSDL... 

[ERROR] Received fatal alert: handshake_failure 

Failed to read the WSDL document: "https://wsdl.location.com?WSDL", because 1) could 
not find the document; /2) the document could not be read; 3) the root element of 
the document is not <wsdl:definitions>. 

[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s): 

At least one WSDL with at least one service definition needs to be provided. 

    Failed to parse the WSDL. 
+0

compartiendo el error/excepción stacktrace que enfrenta ayuda a otros a entender el problema. – sundar

+0

He actualizado la publicación para mostrar más detalles. Gracias – Cuga

+0

http://ibswings.blogspot.in/2008/12/running-axis-wsdl2java-on-https-wsdl.html intente esto – sundar

Respuesta

8

Puede llamar directamente a la clase wsimport java (source) y añadir la JVM necesaria args para Java sabiendo dónde buscar certificados de clientes.

Algo así como

java -classpath C:\jdk160_29\lib\tools.jar -Djavax.net.ssl.trustStore=c:\jdk160_29\.mykeystore com.sun.tools.internal.ws.WsImport https://host:8443/Webservice?wsdl -p com.test -s ./src" 

debe hacer el truco.

+2

hará el truco +1 – RamonBoza

+0

Falló para yo con un 'Exception in thread" principal "java.lang.NoSuchFieldError: theInstance', sin embargo, he encontrado una alternativa. –

3

Logré hacer esto configurando la variable de entorno _JAVA_OPTIONS con todas las propiedades adicionales del sistema para pasar; como un archivo por lotes de Windows que tiene este aspecto (poner su contraseña en cuando sea apropiado:

setlocal 
set _JAVA_OPTIONS=%_JAVA_OPTIONS% -Djavax.net.ssl.trustStore="%JAVA_HOME%\jre\lib\security\cacerts" -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStorePassword={...passwordForThePFX...} -Djavax.net.ssl.keyStore=r:\cert.pfx 
wsimport -s . -verbose https://your.host.name/path/to/service?wsdl 
endlocal 

Por el bien de la cordura, las opciones de Java en la línea de tiempo 'set' son:

-Djavax.net.ssl.trustStore="%JAVA_HOME%\jre\lib\security\cacerts" 
-Djavax.net.ssl.keyStoreType=PKCS12 
-Djavax.net.ssl.keyStorePassword={...passwordForThePFX...} 
-Djavax.net.ssl.keyStore=R:\cert.pfx 

Usted puede o puede que no necesite especificar la configuración trustStore; tuve que tener como tengo un par de instalaciones y Java estaba recogiendo el archivo de cacerts incorrecto para mí.

De manera similar, no necesitará el keyStorePassword si el almacén de claves no está 't contraseña protegida. En cuanto a keyStoreType, deberá especificar esto si no está accediendo a un almacén de claves Java.

En última instancia, la única opción "obligatoria" es keyStore que define dónde viven las claves y el certificado del cliente (y solo es obligatorio si el certificado del cliente no se encuentra en ninguno de los almacenes de certificados Java centrales). Tal como está, el ejemplo anterior es para un certificado de cliente en un archivo PFX generado al exportarlo desde el almacén de certificados de Windows.

2

Me pareció mucho más fácil (no es necesario jugar con -D, classpath, ...) a:
1. descargue el wsdl vía ssl con su navegador (instale el certificado en su navegador predeterminado haciendo doble clic en el almacén de claves) o incluso más fácil con soapUI (instale el keystore a través de config/ssl) que muestra el contenido del wsdl
2. ejecute el wsimport contra el wsdl descargado
Eso es todo.

Cuestiones relacionadas