Error al acceder a un servicio web con SSL

Tengo un progtwig que se supone que envía un archivo a un servicio web, que requiere una conexión SSL. Ejecuto el progtwig 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 

Esto funcionó bien, pero cuando cambio la primera línea a

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

Obtuve 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.(HttpsURLConnection.java:36) at com.ibm.net.ssl.www2.protocol.https.b.(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 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?

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

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

Intenta agregar estas dos líneas en algún lugar de tu código de configuración:

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

Java solo permite una clase de fábrica de conexión SSL para una JVM. Si está utilizando un JDK que se incluye con WebSphere Application Server v6x / 7x / 8x o cualquier otra herramienta de servidor de WebSphere en Rational Application Developer, entonces esos 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 zócalos JSSE configuradas 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 elimina el comentario de las fábricas de Sockets de JSSE predeterminadas y comenta las de WebSphere, WAS se va a vomitar.

Una solución mejor sería tener el archivo com.ibm.ws.security.crypto.jar en su ruta de clase. Este archivo jar tiene una dependencia del archivo com.ibm.ffdc.jar, por lo que también lo necesita en su ruta de clase. Ambos archivos jar están disponibles en /plugins/

uno puede establecer estas propiedades en el archivo WAS_HOME / * / java / jre / lib / security / java.security descomentando las siguientes propiedades de JSSE.

Fábricas de zócalo JSSE predeterminadas

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

Una “solución” más que parece estar funcionando para mí. Cree 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 maven), agregue la opción de línea de comando:

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

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

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

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

Y establecer el vacío de la fábrica:

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

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

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

    Intereting Posts