Ошибка доступа к веб-сервису с SSL - PullRequest
13 голосов
/ 05 мая 2010

У меня есть программа, которая должна отправлять файл в веб-службу, для которой требуется соединение 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

Это работало нормально, но когда я меняю первую строку на

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

Я получаю следующую ошибку:

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

Так что, похоже, эта проблема будет связана с JRE, который я использую, но, похоже, не имеет смысла, что JRE не-IBM работает нормально, а IBM JRE - нет. Есть идеи или предложения?

Ответы [ 7 ]

20 голосов
/ 06 мая 2010

Попробуйте добавить эти две строки где-нибудь в вашем коде установки:

Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");
8 голосов
/ 25 февраля 2012

Java допускает только один класс фабрики соединений SSL для JVM. Если вы используете JDK, поставляемый с WebSphere Application Server v6x / 7x / 8x или любыми другими инструментами сервера WebSphere в Rational Application Developer, то для них требуется специальный класс IBM (com.ibm.websphere.ssl.protocol.SSLSocketFactory) из WebSphere Application Время работы сервера. потому что в файле безопасности Java установлены фабрики сокетов JSSE, как показано ниже

# 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

Итак, если вы раскомментируете фабрики сокетов JSSE по умолчанию и комментируете фабрики WebSphere, тогда WAS будет рвать.

Лучше обойти это, если в вашем пути к классам есть файл com.ibm.ws.security.crypto.jar. Этот jar-файл зависит от файла com.ibm.ffdc.jar, поэтому он вам нужен в пути к классам. Оба эти jarfiles доступны под <WebSphere_Install_Dirctory>/plugins/

4 голосов
/ 05 мая 2010

Если у вас не IBM jre - sun, то он уже поставляется вместе с реализацией классов SSL.

Кажется, IBM jre вообще не содержит классов реализации SSL.

2 голосов
/ 31 марта 2015

Еще одно «решение», которое, похоже, работает для меня. Создайте свой собственный файл свойств безопасности, my.java.security с содержимым, подобным:

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

При вызове Java (или в моем случае maven) добавьте параметр командной строки:

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

Получено по документации IBM Liberty: http://www -01.ibm.com / support / Knowledgecenter / was_beta_liberty / com.ibm.websphere.wlp.nd.multiplatform.doc / ae / rwlp_trouble.html? Lang = еп

2 голосов
/ 27 июня 2011

можно установить эти свойства в файле WAS_HOME / * / java / jre / lib / security / java.security, закомментировав следующие параметры JSSE.

Фабрики сокетов JSSE по умолчанию

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

1 голос
/ 12 июля 2016

Нашел эту тему при поиске того же сообщения об ошибке, но нашел другое решение. Чтобы протестировать службу https REST с помощью клиента Apache Wink:

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

И установить пустую фабрику:

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

Моя среда выполнения - это отдельный тест Camel с использованием IBM JRE 1.7 из IBM WebSphere v8.5.5.

0 голосов
/ 30 сентября 2016

У меня была похожая проблема, когда мое пакетное приложение пыталось получить данные из веб-службы Restful, используя Apache. Я использовал MyEclipse в качестве среды разработки. И использовал JRE, предоставленный IBM WebSphere 8.5. Когда я перешел на Sun 1.6 jre, проблема была решена.

...