2010-05-05 23 views
12

Possiedo un programma che deve inviare un file a un servizio Web che richiede una connessione SSL. Corro il programma come segue:Errore durante l'accesso a un servizio Web con 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 

Questo è stato funziona bene, ma quando cambio la prima linea a

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

ottengo il seguente errore:

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 

così sembra che questo problema sarebbe correlato al JRE che sto usando, ma ciò che non sembra avere senso è che il JRE non IBM funzioni bene, ma IBM JRE no. Qualche idea o suggerimento?

risposta

4

Se il jre non IBM è soleggiato, viene fornito con implementazione di classi SSL.

Sembra che il jre IBM non contenga affatto classi di implementazione SSL.

+2

Per chiarire un po 'perché è leggermente scorretto. Il JRE di cui si parla è WAS JRE. Ogni JRE IBM contiene classi SSL, ma questo non dovrebbe essere utilizzato per programmi Java standalone e contiene la configurazione per il provider SSL che è incluso nelle librerie WAS. Se lo si utilizza senza WebSphere, è necessario sovrascrivere 'ssl.SocketFactory.provider' e' ssl.ServerSocketFactory.provider' da 'java.security' – Gas

20

Prova ad aggiungere queste due righe da qualche parte nel codice di installazione:

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

Ho fatto questo e ora ottengo l'eccezione seguente: java.security. KeyStoreException: IBMKeyManager: problema dell'accesso al keystore java.io.IOException: il keystore è stato manomesso o la password non è corretta. Sembra che ho bisogno di mettere "changeme" da qualche parte? – Anton

2

si può impostare queste proprietà al file di WAS_HOME/*/java/jre/lib/security/java.security dai uncomenting i seguenti oggetti di scena JSSE .

predefinite presa JSSE fabbriche

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

+0

è necessario commentare le websphere che lo seguono. –

7

Java consente solo una produzione di connessioni SSL classe per una JVM. Se si utilizza un JDK fornito con WebSphere Application Server v6x/7x/8x o qualsiasi altro strumento server WebSphere in Rational Application Developer, allora quelli richiedono la classe specifica IBM (com.ibm.websphere.ssl.protocol.SSLSocketFactory) dall'applicazione WebSphere Runtime del server. perché il file di sicurezza Java ha le fabbriche presa JSSE indicati come qui di seguito

# 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 

Quindi, se si rimuove il commento il default JSSE Socket fabbriche e commentare fuori quelle WebSphere poi è stato sta per vomitare.

Un lavoro migliore sarebbe avere il file com.ibm.ws.security.crypto.jar nel percorso della classe. Questo file jar ha una dipendenza dal file com.ibm.ffdc.jar, quindi è necessario che nel tuo percorso classe sia necessario. Entrambi questi file jar sono disponibili sotto <WebSphere_Install_Dirctory>/plugins/

+0

Potrei essere fortunato, ma l'utilizzo delle factory socket JSSE predefinite (con quella commentata da WebSphere) sembra funzionare per me. Ora posso usare JDK con i miei build CI. –

+0

puoi dirmi come ha iniziato a funzionare ?? Sto affrontando lo stesso problema .. – Raj

2

Un'altra "soluzione" che sembra funzionare per me. Creare il proprio file di proprietà di sicurezza, my.java.security con contenuti come:

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

Quando si chiama Java (o nel mio caso Maven), aggiungere l'opzione riga di comando:

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

cribbed dalla documentazione 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

Trovato questo argomento durante la ricerca dello stesso messaggio di errore ma trovato una soluzione diversa. Per testare un servizio https REST utilizzando il client Apache Wink:

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

e impostare la fabbrica vuota:

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

Il mio tempo di esecuzione è un test autonomo Camel usando IBM JRE 1.7 da IBM WebSphere v8.5.5 .

0

Avevo un problema simile quando la mia applicazione Batch stava cercando di recuperare i dati dal servizio Web Restful usando l'Apache wink. Stavo usando MyEclipse come mio ambiente di sviluppo. E stava usando il jre fornito da IBM webSphere 8.5. Quando sono passato a Sun 1.6 jre, il problema è stato risolto.

Problemi correlati