2010-05-05 36 views
12

Tengo un programa que se supone que envía un archivo a un servicio web, que requiere una conexión SSL. Puedo ejecutar el programa de la siguiente manera:Error al acceder a un servicio web con SSL

SET JAVA_HOME=C:\Program Files\Java\jre1.6.0_07 
SET com.ibm.SSL.ConfigURL=ssl.client.props 
"%JAVA_HOME%\bin\java" -cp ".;Test.jar" ca.mypackage.Main 

Ésta era funciona bien, pero cuando cambio la primera línea de

SET JAVA_HOME=C:\Program Files\IBM\SDP\runtimes\base_v7\java\jre 

me sale el siguiente error:

com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory 
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:119) 
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:140) 
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:86) 
at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:593) 
at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:552) 
at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:537) 
at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:434) 
at com.sun.xml.internal.ws.client.Stub.process(Stub.java:247) 
at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:132) 
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:242) 
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:222) 
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:115) 
at $Proxy26.fileSubmit(Unknown Source) 
at com.testing.TestingSoapProxy.fileSubmit(TestingSoapProxy.java:81) 
at ca.mypackage.Main.main(Main.java:63) 
Caused by: java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory 
at javax.net.ssl.DefaultSSLSocketFactory.a(SSLSocketFactory.java:7) 
at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:1) 
at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:110) 
at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:14) 
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:902) 
at com.ibm.net.ssl.www2.protocol.https.b.getOutputStream(b.java:86) 
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:107) 
... 14 more 
Caused by: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory 
at javax.net.ssl.SSLJsseUtil.b(SSLJsseUtil.java:20) 
at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:36) 
at javax.net.ssl.HttpsURLConnection.getDefaultSSLSocketFactory(HttpsURLConnection.java:16) 
at javax.net.ssl.HttpsURLConnection.<init>(HttpsURLConnection.java:36) 
at com.ibm.net.ssl.www2.protocol.https.b.<init>(b.java:1) 
at com.ibm.net.ssl.www2.protocol.https.Handler.openConnection(Handler.java:11) 
at java.net.URL.openConnection(URL.java:995) 
at com.sun.xml.internal.ws.api.EndpointAddress.openConnection(EndpointAddress.java:206) 
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.createHttpConnection(HttpClientTransport.java:277) 
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:103) 
... 14 more 

por lo que parece que este problema estaría relacionado con el JRE que estoy usando, pero lo que no parece tener sentido es que el JRE que no es de IBM funciona bien, pero el JRE de IBM no. ¿Alguna idea o sugerencia?

Respuesta

4

Si su IBM jre no es sun, entonces ya viene con la implementación de clases SSL junto con él.

Parece que IBM jre no contiene clases de implementación SSL en absoluto.

+2

Para aclararlo un poco, ya que es ligeramente incorrecto. El JRE referido en la pregunta es WAS JRE. Cada JRE de IBM contiene clases de SSL, pero se supone que esta no debe usarse para programas de Java independientes y contiene la configuración del proveedor de SSL que se incluye en las bibliotecas de WAS. Si lo está utilizando sin WebSphere, debe reemplazar 'ssl.SocketFactory.provider' y' ssl.ServerSocketFactory.provider' from 'java.security' – Gas

20

Trate de añadir estas dos líneas en algún lugar de su código de configuración:

Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl"); 
Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl"); 
+0

He hecho esto y ahora obtengo la siguiente excepción: java.security. KeyStoreException: IBMKeyManager: Problema al acceder al almacén de claves java.io.IOException: Keystore se manipuló o la contraseña era incorrecta. Parece que necesito poner "changeme" en alguna parte? – Anton

2

uno puede establecer estas propiedades en el archivo WAS_HOME/*/java/jre/lib/security/java.security por uncomenting los siguientes apoyos JSSE .

predeterminados fábricas de socket JSSE

ssl.SocketFactory.provider = com.ibm.jsse2.SSLSocketFactoryImpl ssl.ServerSocketFactory.provider = com.ibm.jsse2.SSLServerSocketFactoryImpl

+0

necesita comentar los websphere que están detrás de él. –

7

Java sólo permite una conexión SSL fábrica clase para una JVM. Si está utilizando un JDK que se envía con WebSphere Application Server v6x/7x/8x o cualquier otra herramienta de servidor WebSphere en Rational Application Developer, entonces estos requieren una clase específica de IBM (com.ibm.websphere.ssl.protocol.SSLSocketFactory) de la aplicación WebSphere Tiempo de ejecución del servidor porque el archivo de seguridad de Java tiene las fábricas de socket JSSE establecidos, como a continuación

# Default JSSE socket factories 
#ssl.SocketFactory.provider=com.ibm.jsse2.SSLSocketFactoryImpl 
#ssl.ServerSocketFactory.provider=com.ibm.jsse2.SSLServerSocketFactoryImpl 

# WebSphere socket factories (in cryptosf.jar) 
ssl.SocketFactory.provider=com.ibm.websphere.ssl.protocol.SSLSocketFactory 
ssl.ServerSocketFactory.provider=com.ibm.websphere.ssl.protocol.SSLServerSocketFactory 

Así, Si se quite la línea Default fábricas JSSE zócalo y comente las sean WebSphere que entonces se va a vomitar.

Mejor solución sería tener el archivo com.ibm.ws.security.crypto.jar en su ruta de clase. Este archivo jar tiene una dependencia en el archivo com.ibm.ffdc.jar así que lo necesita en su ruta de clase también. Ambos archivos jar están disponibles en <WebSphere_Install_Dirctory>/plugins/

+0

Puedo tener suerte, pero el uso de las fábricas de Sockets JSSE Predeterminadas (con la comentada de WebSphere) parece funcionar para mí. Ahora puedo usar el JDK con mis compilaciones CI. –

+0

¿Pueden por favor decirme cómo comenzó a funcionar? Estoy enfrentando el mismo problema ... – Raj

2

Una "solución" más que parece funcionar para mí. Crear su propio archivo de propiedades de seguridad, my.java.security con contenidos como:

ssl.SocketFactory.provider= 
ssl.ServerSocketFactory.provider= 

Al llamar a Java (o en mi caso experta), añadir la opción de línea de comandos:

-Djava.security.properties=C:\myfiles\my.java.security 

cribbed de la documentación de IBM libertad: http://www-01.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/rwlp_trouble.html?lang=en

1

Encontré este tema mientras buscaba el mismo mensaje de error pero encontré una solución diferente. Para probar un servicio https REST utilizando el cliente Apache Wink:

ClientConfig config = new ClientConfig(); 
config.setBypassHostnameVerification(true); 
RestClient client = new RestClient(config); 

y SET de la Fábrica de vacío:

Security.setProperty("ssl.SocketFactory.provider", ""); 
Security.setProperty("ssl.ServerSocketFactory.provider", ""); 

Mi tiempo de ejecución es una prueba independiente Camel utilizando IBM JRE 1.7 de IBM WebSphere v8.5.5 .

0

Tuve un problema similar cuando mi aplicación Batch estaba tratando de obtener datos del servicio web Restful usando Apache wink. Estaba usando MyEclipse como mi entorno de desarrollo. Y estaba usando la jre proporcionada por IBM webSphere 8.5. Cuando cambié a Sun 1.6 jre, el problema se resolvió.

Cuestiones relacionadas