web-dev-qa-db-ja.com

SSLを使用したWebサービスへのアクセスエラー

SSL接続を必要とするWebサービスにファイルを送信することになっているプログラムがあります。次のようにプログラムを実行します。

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に関連しているようですが、IBM以外のJREは正常に機能しますが、IBM JREは機能しないというのは意味がないようです。アイデアや提案はありますか?

13
Elie

IBM以外のjreがSunである場合、SunにはすでにSSLクラス実装が同梱されています。

IBM jreにはSSL実装クラスがまったく含まれていないようです。

4
Fazal

次の2行をセットアップコードのどこかに追加してみてください。

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

Javaでは、JVMに対して1つのSSL接続ファクトリクラスのみを許可します。 WebSphere Application Server v6x/7x/8xまたはRational Application Developerの他のWebSphereサーバーツールに同梱されているJDKを使用している場合、WebSphere ApplicationのIBM(com.ibm.websphere.ssl.protocol.SSLSocketFactory)固有のクラスが必要です。サーバーランタイム。 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ファイルに依存しているため、クラスパスで必要です。これらのjarfileは両方とも<WebSphere_Install_Dirctory>/plugins/で入手できます

8
Anil

wAS_HOME/*/Java/jre/lib/security/Java.securityファイルでこれらのプロパティを設定するには、次のJSSEプロパティのコメントを外します。

デフォルトのJSSEソケットファクトリ

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

2
Ashish

私のために働いているように見えるもう一つの「解決策」。独自のセキュリティプロパティファイル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 = en

2
peater

同じエラーメッセージを検索中にこのトピックが見つかりましたが、別の解決策が見つかりました。 Apache Winkクライアントを使用してhttps RESTサービスをテストするには:

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

そして、ファクトリーを空に設定します:

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

私のランタイムは、IBM WebSphere v8.5.5のIBM JRE 1.7を使用したスタンドアロンのキャメルテストです。

1
JStefan

BatchアプリケーションがApache Winkを使用してRestful Webサービスからデータを取得しようとしたときに、同様の問題が発生しました。私は開発環境としてMyEclipseを使用していました。また、IBM webSphere 8.5が提供するjreを使用していました。 Sun 1.6 jreに変更すると、問題は解決しました。