2010-05-05 36 views
12

Tôi có một chương trình được yêu cầu gửi tệp tới dịch vụ web, yêu cầu kết nối SSL. Tôi chạy chương trình như sau:Lỗi khi truy cập Dịch vụ Web với 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 

Đây là công trình tốt, nhưng khi tôi thay đổi dòng đầu tiên để

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

tôi nhận được lỗi sau:

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 

Vì vậy, có vẻ như rằng vấn đề này sẽ liên quan đến JRE mà tôi đang sử dụng, nhưng những gì dường như không hợp lý là JRE không phải của IBM hoạt động tốt, nhưng JRE của IBM thì không. Bất kỳ ý tưởng hoặc đề xuất nào?

Trả lời

4

Nếu jre không phải của bạn là mặt trời, thì nó đã đi kèm với việc triển khai các lớp SSL cùng với nó.

Dường như IBM jre không chứa các lớp triển khai SSL.

+2

Để làm rõ nó một chút vì nó hơi không chính xác. Câu hỏi JRE được đề cập là WAS JRE. Mỗi JRE của IBM đều chứa các lớp SSL, nhưng không phải là lớp này được sử dụng cho các chương trình Java độc lập và nó chứa cấu hình cho nhà cung cấp SSL được bao gồm trong các thư viện của WAS. Nếu bạn đang sử dụng nó mà không có WebSphere, bạn cần ghi đè 'ssl.SocketFactory.provider' và' ssl.ServerSocketFactory.provider' từ 'java.security' – Gas

20

Hãy thử thêm hai dòng sau ở đâu đó trong mã thiết lập của bạn:

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

Tôi đã làm điều này và bây giờ tôi nhận được ngoại lệ sau: java.security. KeyStoreException: IBMKeyManager: Sự cố khi truy cập kho khóa java.io.IOException: Keystore bị giả mạo hoặc mật khẩu không chính xác. Có vẻ như tôi cần phải đặt "changeme" ở đâu đó? – Anton

2

người ta có thể thiết lập các thuộc tính tại WAS_HOME/*/java/jre/lib tập tin/security/java.security bởi uncomenting đạo cụ JSSE sau .

Mặc định JSSE ổ cắm nhà máy

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

+0

bạn cần phải nhận xét ra những websphere những người được sau khi nó. –

7

Java chỉ cho phép máy kết nối một SSL lớp cho một JVM. Nếu bạn đang sử dụng các tệp JDK được vận chuyển với Máy chủ ứng dụng WebSphere v6x/7x/8x hoặc bất kỳ công cụ máy chủ WebSphere nào khác trong Rational Application Developer, thì những công cụ đó yêu cầu lớp cụ thể của IBM (com.ibm.websphere.ssl.protocol.SSLSocketFactory) từ WebSphere Application Thời gian chạy của máy chủ. vì các tập tin an ninh java có các nhà máy JSSE ổ cắm thiết lập như bên dưới

# 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 

Vì vậy, Nếu bạn bỏ ghi chú mặc định nhà máy JSSE Socket và nhận xét ra những WebSphere Bấy giờ có kẻ sẽ nôn.

Làm việc tốt hơn là có tệp com.ibm.ws.security.crypto.jar trong đường dẫn lớp của bạn. Tệp jar này có một sự phụ thuộc vào tệp com.ibm.ffdc.jar vì vậy bạn cần nó trong đường dẫn lớp của bạn tốt. Cả hai con lùn này đều có sẵn theo số <WebSphere_Install_Dirctory>/plugins/

+0

Tôi có thể may mắn, nhưng bằng cách sử dụng các nhà máy sản xuất ổ cắm JSSE mặc định (với bộ phận WebSphere nhận xét) dường như có tác dụng đối với tôi. Bây giờ tôi có thể sử dụng JDK với các bản dựng CI của tôi. –

+0

bạn có thể nói cho tôi biết nó bắt đầu hoạt động như thế nào không ?? Tôi đang đối mặt với cùng một vấn đề .. – Raj

2

Một giải pháp "khác" có vẻ đang hoạt động đối với tôi. Tạo tài sản bảo đảm của tập tin của bạn, my.java.security với nội dung như sau:

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

Khi gọi Java (hoặc trong trường hợp maven của tôi), thêm các tùy chọn dòng lệnh:

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

Cribbed từ tài liệu của 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

1

Tìm chủ đề này trong khi tìm kiếm thông báo lỗi tương tự nhưng tìm thấy giải pháp khác. Để thử nghiệm một dịch vụ https REST của sử dụng client Apache Wink:

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

Và thiết lập của máy trống:

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

thời gian chạy của tôi là một thử nghiệm Camel độc lập sử dụng IBM JRE 1.7 từ IBM WebSphere v8.5.5 .

0

Tôi gặp sự cố tương tự khi ứng dụng Hàng loạt của tôi đang cố tìm nạp dữ liệu từ dịch vụ web Restful bằng cách sử dụng Apache nháy mắt. Tôi đã sử dụng MyEclipse làm môi trường dev của mình. Và đang sử dụng jre được cung cấp bởi IBM webSphere 8.5. Khi tôi chuyển sang Sun 1.6 jre, vấn đề đã được giải quyết.

Các vấn đề liên quan