2010-05-05 31 views
12

SSL bağlantısı gerektiren bir web servisine bir dosya göndermesi gereken bir programım var. aşağıdaki gibi ben programı çalıştırın: Bu eserler iyiydiSSL ile bir Web Hizmetine erişirken hata

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 

ama aşağıdaki hatayı alıyorum

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

ilk satırı değiştirdiğinizde:

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 

Öyle görünüyor Bu sorunun kullanıyorum JRE ile ilgili olacağını, ancak mantıklı görünmüyor ne IBM olmayan JRE iyi çalışıyor, ancak IBM JRE değil. Herhangi bir fikir veya öneri?

cevap

4

IBM dışı jr'niz güneşse, zaten birlikte paketlenmiş SSL sınıfları uygulamasıyla birlikte gelir.

IBM jre, SSL uygulama sınıfları içermiyor gibi görünüyor. Kurulum kodunda bir yerde bu iki satırı ekleyerek

+2

Biraz yanlış olduğu için biraz netleştirmek için. Söz konusu JRE, WAS JRE'dir. Her bir IBM JRE, SSL sınıflarını içerir, ancak bunun tek başına Java programları için kullanılmaması ve WAS kitaplıklarında yer alan SSL sağlayıcısı için yapılandırmayı içermesi gerekir. WebSphere kullanmadan kullanıyorsanız, ssl.SocketFactory.provider' ve 'ssl.ServerSocketFactory.provider'ı' java.security' – Gas

20

Dene:

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

'dan geçersiz kılmanız gerekiyor. Bunu yaptık ve şimdi istisna yapıyorum: java.security. KeyStoreException: IBMKeyManager: Anahtar deposuna erişimde sorun var java.io.IOException: Keystore ile oynanmış veya şifre yanlış. Bir yere "changeme" koymam gerekecek mi? – Anton

2

biri aşağıdaki JSSE sahne uncomenting tarafından WAS_HOME/*/java/jre/lib/güvenlik/java.security dosyasına bu özellikleri ayarlayabilirsiniz .

Standart JSSE soket fabrikaları

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

+0

web sitesinden sonra olanları yorumlamanız gerekir. –

7

Java yalnızca bir SSL bağlantı fabrikası verir JVM için sınıf. Rational Application Developer uygulamasında WebSphere Application Server v6x/7x/8x veya başka bir WebSphere sunucu aracıyla birlikte gönderilen bir JDK kullanıyorsanız, bunlar WebSphere Application'dan IBM (com.ibm.websphere.ssl.protocol.SSLSocketFactory) özel bir sınıf gerektirir. Sunucu çalışma zamanı. java güvenlik dosyası Varsayılan JSSE Soket fabrikaları yorumsuz ve sonra WebSphere olanları yorum yaparsanız, kusmak gidiyor WAS Yani

# 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 

aşağıdaki gibi kurulur JSSE soket fabrikaları vardır çünkü.

Sınıf çalışmanızda com.ibm.ws.security.crypto.jar dosyasının bulunması daha iyi olacaktır. Bu jar dosyası com.ibm.ffdc.jar dosyasına bir bağımlılığa sahiptir, böylece sınıf yolunuzda buna ihtiyacınız vardır. Her iki joker, <WebSphere_Install_Dirctory>/plugins/

+0

Şanslı olabilirim, ancak Varsayılan JSSE soket fabrikalarını kullanmak (WebSphere bir yorumda bulundu) benim için işe yarıyor gibi görünüyor. Şimdi JDK'yı CI yapılarım ile kullanabilirim. –

+0

bana nasıl başladığını anlatır mısınız? Aynı konuyla yüzleşiyorum .. – Raj

2

altındadır. Benim için çalışmakta olan bir başka çözüm. gibi içeriği ile, my.java.security kendi güvenlik özellikleri dosyası oluşturun: IBM Liberty belgelerinden

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

cribbed:

ssl.SocketFactory.provider= 
ssl.ServerSocketFactory.provider= 
Java arayarak (veya benim durumumda maven içinde) olduğunda, komut satırı seçeneğini ekleyin: http://www-01.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/rwlp_trouble.html?lang=en

1

Aynı hata iletisini ararken bu konuyu bulduk ancak farklı bir çözüm bulduk. Apache Wink istemcisi kullanarak bir https REST hizmetini test etmek için:

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

Ve ayarlamak Fabrika boş:

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

Benim çalışma zamanı, IBM WebSphere v8.5.5 IBM JRE 1.7 kullanarak tek başına Deve testidir .

0

Batch uygulamasının Apache wink kullanarak Restful web hizmetinden veri almaya çalışırken benzer bir sorun yaşadım. MyEclipse'i dev ortamım olarak kullanıyordum. Ve IBM webSphere 8.5 tarafından sağlanan jre kullanıyordu. Sun 1.6 jre'ye değiştirdiğimde sorun çözüldü.