2010-05-05 4 views
12

J'ai un programme censé envoyer un fichier à un service Web, ce qui nécessite une connexion SSL. Je lance le programme comme suit:Erreur lors de l'accès à un service Web avec 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 

C'était fonctionne très bien, mais quand je change la première ligne à

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

Je reçois l'erreur suivante:

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 

Il semble donc que ce problème serait lié au JRE que j'utilise, mais ce qui ne semble pas logique, c'est que le JRE non-IBM fonctionne correctement, mais pas le JRE IBM. Des idées ou des suggestions?

Répondre

4

Si votre non IBM jre est le soleil, il est déjà avec des classes SSL mise en œuvre emballés avec elle.

Il semble IBM jre ne contenant classes d'implémentation SSL du tout.

+2

Pour clarifier un peu car c'est légèrement incorrect. Le JRE mentionné en question est WAS JRE. Chaque IBM JRE contient des classes SSL, mais celle-ci n'est pas censée être utilisée pour les programmes Java autonomes et contient la configuration pour le fournisseur SSL qui est incluse dans les bibliothèques WAS. Si vous l'utilisez sans WebSphere vous devez remplacer 'ssl.SocketFactory.provider' et' ssl.ServerSocketFactory.provider' de 'java.security' – Gas

20

Essayez d'ajouter ces deux lignes quelque part dans votre code d'installation:

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

J'ai fait cela et maintenant je reçois l'exception suivante: java.security. KeyStoreException: IBMKeyManager: Problème lors de l'accès au magasin de clés java.io.IOException: Le fichier de clés a été altéré ou le mot de passe était incorrect. On dirait que j'ai besoin de mettre "changeme" quelque part? – Anton

2

on peut définir ces propriétés à WAS_HOME/*/java/jre/lib/security/java.security par uncomenting les accessoires JSSE suivants .

par défaut usines socket JSSE

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

+0

vous devez commenter les websphere qui le suivent. –

7

Java ne permet qu'une seule usine de connexion SSL classe pour une machine virtuelle Java. Si vous utilisez un thats JDK livré avec votre WebSphere Application Server V6X/7x/8x ou tout autre outil de serveur WebSphere dans Rational Application Developer, puis ceux exigent IBM (com.ibm.websphere.ssl.protocol.SSLSocketFactory) classe spécifique de WebSphere Application L'exécution du serveur. parce que le fichier de sécurité Java a les usines de socket JSSE définies comme ci-dessous

# 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 

Donc, si vous supprimez le défaut JSSE usines Socket et commentez les WebSphere puis WAS va vomir.

travail serait mieux autour d'avoir fichier com.ibm.ws.security.crypto.jar dans votre chemin de classe. Ce fichier jar a une dépendance sur le fichier com.ibm.ffdc.jar donc vous en avez bien besoin dans votre chemin de classe. Ces deux jarfiles sont disponibles sous <WebSphere_Install_Dirctory>/plugins/

+0

J'ai peut-être de la chance, mais l'utilisation des fabriques de connecteurs JSSE par défaut (avec WebSphere en commentaire) semble fonctionner pour moi. Maintenant, je peux utiliser le JDK avec mes builds CI. –

+0

pouvez-vous me dire comment il a commencé à travailler ?? Je suis confronté au même problème .. – Raj

2

Encore une "solution" qui semble fonctionner pour moi. Créez votre propre fichier de propriétés de sécurité, my.java.security avec des contenus tels que:

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

Lorsque vous appelez Java (ou dans mon cas Maven), ajoutez l'option de ligne de commande:

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

cribbed de la documentation IBM Liberté: http://www-01.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/rwlp_trouble.html?lang=en

1

Trouvé ce sujet lors de la recherche du même message d'erreur mais trouvé une solution différente. Pour tester un service REST https en utilisant le client Clin Apache:

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

et établi par l'usine vide de:

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

Mon temps d'exécution est un test Camel autonome à l'aide d'IBM JRE 1.7 de v8.5.5 IBM WebSphere .

0

J'ai rencontré un problème similaire lorsque mon application Batch essayait d'extraire des données du service Web Restful à l'aide d'Apache wink. J'utilisais MyEclipse comme environnement de développement. Et utilisait le jre fourni par IBM webSphere 8.5. Lorsque je suis passé à Sun 1.6 jre, le problème a été résolu.

Questions connexes