Pregunta

Tengo un programa que se supone que enviar un archivo a un servicio web, que requiere una conexión SSL. Puedo ejecutar el programa de la siguiente manera:

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

Esta era funciona bien, pero cuando cambio la primera línea

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

Así que parece que este problema podría estar relacionado con el JRE que estoy usando, pero lo que no parece tener sentido es que el no sea de IBM JRE bien funciona, pero el IBM JRE no lo hace. Cualquier idea o sugerencia?

¿Fue útil?

Solución

Si su jre no IBM es el sol, lo que ya viene con la aplicación clases SSL empaquetado junto con él.

Parece que la IBM JRE no está conteniendo clases de implementación de SSL en absoluto.

Otros consejos

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");

Java sólo permite una clase de fábrica de conexión SSL para una JVM. Si está utilizando un eso es JDK que se suministra con WebSphere Application Server V6X / 7x / 8x o cualquier otro servidor WebSphere herramientas de Rational Application Developer, entonces ellos requieren IBM (com.ibm.websphere.ssl.protocol.SSLSocketFactory) clase específica de WebSphere Application 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

Por lo tanto, Si quite el defecto fábricas JSSE zócalo y comente las WebSphere que entonces se va a vomitar.

Una mejor en torno al trabajo sería tener com.ibm.ws.security.crypto.jar archivo en la ruta de clase. Este archivo jar tiene una dependencia de archivo com.ibm.ffdc.jar por lo que necesita que en su ruta de clase bien. Ambos están disponibles bajo jarfiles <WebSphere_Install_Dirctory>/plugins/

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

Default JSSE socket fábricas

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

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

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

Cuando se llama 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 = es

encontrado este tema en la búsqueda del mismo mensaje de error, pero no encontró una solución diferente. Para probar un servicio REST https utilizando el cliente Apache Wink:

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

Y conjunto vacío de la fábrica:

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.

Yo tenía un problema similar cuando mi solicitud de lote estaba tratando de obtener los datos de servicio web utilizando reparador guiño Apache. Yo estaba utilizando MyEclipse como mi entorno de desarrollo. Y estaba usando el JRE proporcionado por IBM WebSphere 8.5. Cuando cambié a Sun JRE 1.6, el problema se resolvió.

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