سؤال

لديّ برنامج من المفترض أن يرسل ملفًا إلى خدمة ويب ، والذي يتطلب اتصال 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 لا يفعل ذلك. أي أفكار ، أو اقتراحات؟

هل كانت مفيدة؟

المحلول

إذا كان JRE غير IBM الخاص بك هو SUN ، فإنه يأتي بالفعل مع تطبيق فصول SSL مع تعبئته معها.

يبدو أن IBM JRE لا يحتوي على فصول تنفيذ SSL على الإطلاق.

نصائح أخرى

حاول إضافة هذين الخطين في مكان ما في رمز الإعداد الخاص بك:

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

Java يسمح فقط بفئة مصنع اتصال SSL واحدة لـ JVM. إذا كنت تستخدم JDK يتم شحنها مع WebSphere Application Server V6x/7x/8x أو أي أدوات خادم WebSphere أخرى في مطور التطبيق العقلاني ، فإن تلك تتطلب IBM (com.ibm.websphere.ssl.protocol.sslsocketfactory) فئة محددة من WebSphere من WebSphere وقت تشغيل الخادم. لأن ملف أمان Java يحتوي على مصانع Socket 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

لذا ، إذا قمت بتفكيك مصانع Socket الافتراضية JSSE والتعليق على WebSphere ، فسيتم Puke.

سيكون العمل الأفضل هو الحصول على ملف com.ibm.ws.security.crypto.jar في مسار الفصل الخاص بك. يحتوي ملف JAR هذا على اعتماد على ملف com.ibm.ffdc.jar حتى تحتاج إلى ذلك في مسار الفصل جيدًا. كلا هذين الجارفيل متوفرة تحت <WebSphere_Install_Dirctory>/plugins/

يمكن للمرء تعيين هذه الخصائص على ملف WAS_HOME/*/JAVA/JRE/LIB/SECURITY/JAVA.Security عن طريق إلغاء الالتحاق بالدعائم JSSE التالية.

مصانع مقبس JSSE الافتراضية

ssl.socketfactory.provider = com.ibm.jsse2

"حل" آخر يبدو أنه يعمل بالنسبة لي. قم بإنشاء ملف خصائص الأمان الخاصة بك ، my.java.security مع محتويات مثل:

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

عند الاتصال بـ Java (أو في حالتي Maven) ، أضف خيار سطر الأوامر:

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

cribsed من وثائق IBM Liberty: http://www-01.ibm.com/support/knowledgecenter/was_beta_biberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/Rwlp_trouble.html؟lang=en

وجدت هذا الموضوع أثناء البحث عن نفس رسالة الخطأ ولكن وجدت حلًا مختلفًا. لاختبار خدمة REST HTTPS باستخدام عميل Apache Wink:

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

وتعيين المصنع فارغ:

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

وقت التشغيل الخاص بي هو اختبار جمل مستقل باستخدام IBM JRE 1.7 من IBM WebSphere V8.5.5.

واجهت مشكلة مماثلة عندما كان تطبيق الدُفعات الخاص بي يحاول جلب البيانات من خدمة Web Restful باستخدام Apache Wink. كنت أستخدم myeclipse كبيئة dev. وكان يستخدم JRE المقدمة من IBM WebSphere 8.5. عندما تغيرت إلى Sun 1.6 JRE ، تم حل المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top