it-swarm.com.de

Fehler beim Zugriff auf einen Webdienst mit SSL

Ich habe ein Programm, das eine Datei an einen Webdienst senden soll, für den eine SSL-Verbindung erforderlich ist. Ich führe das Programm wie folgt aus: 

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

Das funktionierte gut, aber wenn ich die erste Zeile in ändere 

SET Java_HOME=C:\Program Files\IBM\SDP\runtimes\base_v7\Java\jre

Ich erhalte folgende Fehlermeldung:

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

Es scheint also, dass dieses Problem mit der JRE zusammenhängt, die ich verwende, aber es scheint nicht sinnvoll zu sein, dass die Nicht-IBM-JRE einwandfrei funktioniert, die IBM JRE jedoch nicht. Irgendwelche Ideen oder Vorschläge?

12
Elie

Wenn es sich nicht um IBM Jre handelt, wird Sun bereits mit einer Implementierung von SSL-Klassen geliefert.

Es scheint, dass die IBM jre überhaupt keine SSL-Implementierungsklassen enthält. 

4
Fazal

Fügen Sie diese beiden Zeilen irgendwo in Ihren Setup-Code ein:

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

Java lässt nur eine SSL-Verbindungs-Factory-Klasse für eine JVM zu. Wenn Sie ein JDK verwenden, das mit WebSphere Application Server v6x/7x/8x oder einem anderen WebSphere-Server-Tool in Rational Application Developer ausgeliefert wird, benötigen diese eine IBM (com.ibm.websphere.ssl.protocol.SSLSocketFactory) -spezifische Klasse von WebSphere Application Server-Laufzeit. , Da die Java-Sicherheitsdatei die JSSE-Socket-Factorys wie unten festgelegt hat

# 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

Wenn Sie also die Standard-JSSE-Socket-Fabriken auskommentieren und die WebSphere-Funktionen auskommentieren, wird WAS kotzen.

Eine bessere Lösung wäre die Datei com.ibm.ws.security.crypto.jar in Ihrem Klassenpfad. Diese JAR-Datei hängt von der Datei com.ibm.ffdc.jar ab, sodass Sie dies in Ihrem Klassenpfad gut benötigen. Diese beiden Jarfiles sind unter <WebSphere_Install_Dirctory>/plugins/ erhältlich.

8
Anil

sie können diese Eigenschaften in der Datei WAS_HOME/*/Java/jre/lib/security/Java.security festlegen, indem Sie die folgenden JSSE-Requisiten verwenden.

Standardmäßige JSSE-Socketfabriken

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

2
Ashish

Eine weitere "Lösung", die für mich zu funktionieren scheint. Erstellen Sie Ihre eigene Sicherheitseigenschaftendatei my.Java.security mit folgenden Inhalten:

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

Wenn Sie Java (oder in meinem Fall Maven) aufrufen, fügen Sie die Befehlszeilenoption hinzu:

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

Aus der IBM Liberty-Dokumentation herausgeschoben: http://www-01.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/rwlp_trouble.html?lang=de

2
peater

Dieses Thema wurde gefunden, während nach der gleichen Fehlermeldung gesucht wurde, aber eine andere Lösung gefunden wurde. So testen Sie einen https REST -Dienst mit dem Apache Wink-Client:

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

Und die Fabrik leer machen:

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

Meine Laufzeitumgebung ist ein eigenständiger Camel-Test mit IBM JRE 1.7 von IBM WebSphere v8.5.5.

1
JStefan

Ich hatte ein ähnliches Problem, als meine Stapelanwendung mit Apache wink versuchte, Daten vom Restful-Webdienst abzurufen. Ich habe MyEclipse als Entwicklungsumgebung verwendet. Und benutzte die von IBM webSphere 8.5 bereitgestellte Version. Als ich zu Sun 1.6 wechselte, wurde das Problem behoben.