13

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は正常に機能しますが、IBMJREは機能しないというのは意味がないようです。何かアイデアや提案はありますか?

4

7 に答える 7

21

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

Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");
于 2010-05-05T21:13:57.903 に答える
9

Javaは、JVMに対して1つのSSL接続ファクトリクラスのみを許可します。WebSphere Application Server v6x / 7x/8xに同梱されているJDKまたはRationalApplicationDeveloperの他のWebSphereサーバー・ツールを使用している場合、それらには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ファイルに依存しているため、クラスパスにそれが必要です。これらのjarファイルは両方とも<WebSphere_Install_Dirctory>/plugins/

于 2012-02-24T21:13:00.460 に答える
4

IBM以外のjreがsunの場合、SSLクラスの実装がパッケージ化されています。

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

于 2010-05-05T19:57:12.207 に答える
3

私のために働いているように見えるもう1つの「解決策」。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

于 2015-03-31T13:53:26.260 に答える
2

これらのプロパティは、WAS_HOME / * / java / jre / lib / security / java.securityファイルで、次のJSSEプロップの開始を解除することで設定できます。

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

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

于 2011-06-27T02:54:23.487 に答える
1

同じエラーメッセージを検索しているときにこのトピックを見つけましたが、別の解決策を見つけました。ApacheWinkクライアントを使用してhttpsRESTサービスをテストするには:

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

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

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

私のランタイムは、IBMWebSpherev8.5.5のIBMJRE1.7を使用したスタンドアロンのCamelテストです。

于 2016-07-12T06:12:11.150 に答える
0

バッチアプリケーションがApachewinkを使用してRestfulWebサービスからデータをフェッチしようとしたときに、同様の問題が発生しました。私は開発環境としてMyEclipseを使用していました。そして、IBMwebSphere8.5が提供するjreを使用していました。Sun 1.6 jreに変更すると、問題は解決しました。

于 2016-09-30T14:48:07.027 に答える