Fehler einen Web Service mit SSL Zugriff
-
03-10-2019 - |
Frage
ich ein Programm haben, das angeblich eine Datei an einen Web-Service zu senden, die eine SSL-Verbindung erfordert. Ich betreibe das Programm wie folgt:
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 war funktioniert gut, aber wenn ich die erste Zeile ändern
SET JAVA_HOME=C:\Program Files\IBM\SDP\runtimes\base_v7\java\jre
ich die folgende Fehlermeldung erhalten:
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
So scheint es, dass dieses Problem auf den JRE mich in Beziehung gesetzt werden würde ist mit, aber was scheint nicht sinn zu voll ist, dass der Nicht-IBM JRE funktioniert gut, aber die IBM JRE nicht. Irgendwelche Ideen oder Anregungen?
Lösung
Wenn Ihr nicht IBM jre Sonne ist, dann kommt es bereits bei der Implementierung von SSL-Klassen verpackt mit.
Es scheint, die IBM jre ist nicht SSL-Implementierungsklassen überhaupt enthält.
Andere Tipps
Hinzufügen dieser zwei Zeilen irgendwo in Ihrem Setup-Code:
Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");
Java erlaubt nur eine SSL-Verbindung Factory-Klasse für eine JVM. Wenn Sie ein JDK, das ist mit WebSphere Application Server ausgeliefert werden mit v6x / 7x / 8x oder andere WebSphere-Server-Tools in Rational Application Developer, dann die erfordern IBM (com.ibm.websphere.ssl.protocol.SSLSocketFactory) bestimmte Klasse von WebSphere Application Server-Laufzeit. da die Java-Sicherheitsdatei, die JSSE Buchse Fabriken wie unter
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
Also, wenn Sie den Standard JSSE Sockel Fabriken und kommentieren Sie die WebSphere diejenigen Kommentar- dann kotzen WURDE wird.
Bessere Arbeit um wäre com.ibm.ws.security.crypto.jar Datei in Ihrem Klassenpfad zu haben. Diese JAR-Datei hat eine Abhängigkeit von com.ibm.ffdc.jar Datei, so dass Sie, dass in Ihrem Classpath gut brauchen. Beide jarfiles sind unter <WebSphere_Install_Dirctory>/plugins/
man diese Eigenschaften bei WAS_HOME / * / java / jre / lib / security / java.security Datei gesetzt werden folgende JSSE Requisiten von uncomenting.
Standard JSSE Buchse Fabriken
ssl.SocketFactory.provider = com.ibm.jsse2.SSLSocketFactoryImpl ssl.ServerSocketFactory.provider = com.ibm.jsse2.SSLServerSocketFactoryImpl
Eine weitere „Lösung“, die für mich zu arbeiten scheint. Erstellen Sie Ihre eigene Sicherheitseigenschaften Datei, my.java.security
mit Inhalt wie:
ssl.SocketFactory.provider=
ssl.ServerSocketFactory.provider=
Wenn Java Aufruf (oder in meinem Fall Maven), fügen Sie die Befehlszeilenoption:
-Djava.security.properties=C:\myfiles\my.java.security
abgeschaut von der IBM Liberty-Dokumentation: http://www-01.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/rwlp_trouble.html ? lang = de
Dieses Thema gefunden, während für die gleiche Fehlermeldung gesucht, aber eine andere Lösung gefunden. Um zu testen, einen https REST-Dienst des Apache Wink-Client verwenden:
ClientConfig config = new ClientConfig();
config.setBypassHostnameVerification(true);
RestClient client = new RestClient(config);
ein und die Factory leer:
Security.setProperty("ssl.SocketFactory.provider", "");
Security.setProperty("ssl.ServerSocketFactory.provider", "");
Meine Laufzeit ist ein Standalone-Camel-Test IBM JRE 1.7 von IBM WebSphere v8.5.5.
Ich hatte ein ähnliches Problem, wenn meine Batch-Anwendung wurde versucht, Daten von Restful Web-Service-Nachricht unter Verwendung von Apache zu holen. Ich war mit MyEclipse als meine Dev-Umgebung. Und wurde mit der jre zur Verfügung gestellt von IBM Websphere 8.5. Als ich nach Sun 1.6 jre geändert, wurde das Problem behoben.