SSL handshake problème dans webservice avec Java et Tomcat
Je dois consommer un webservice fait dans l'Axe de mon application web Java (qui s'exécute sur le serveur Tomcat). La société qui a fait le service web utilise le protocole HTTPS et un certificat auto-signé pour le test.
J'ai couru un Netbeans wizzard pour générer un Service web basé sur le WSDL, et c'est fait correctement. Si je rentre dans le site web du service web à l'aide d'un navigateur, j'obtiens un message d'avertissement en raison de la certificat SSL, et j'ai créer une exception.
Lors de l'exécution de mon code, je reçois des exceptions lorsque la connexion SSL est faite. Les exceptions sont:
1.
com.soleil.xml.ws.client.ClientTransportException: HTTP erreur de transport: javax.net.le protocole ssl.SSLHandshakeException: Reçu alerte fatale: handshake_failure
et quelques fois (sans changer le code)
2.
com.soleil.xml.ws.client.ClientTransportException: HTTP erreur de transport: javax.net.le protocole ssl.SSLHandshakeException: le soleil.de sécurité.programme de validation.ValidatorException: PKIX chemin d'accès du bâtiment a échoué: le soleil.de sécurité.fournisseur de.certpath.SunCertPathBuilderException: impossible de trouver le chemin de certification valide pour demandé cible
J'imagine que je dois intégrer un certificat dans la machine virtuelle Java et/ou Tomcat, et aussi dit ignorer qui n'est pas une source fiable.
Comment faire? Comment consommer de cette webservice correctement?
Si les renseignements que je fournis ne suffit pas, veuillez en demander plus.
Grâce
Ezequiel
Mise à JOUR:
J'ai essayé deux choses, à la fois, sans succès, les exceptions sont les mêmes.
Option 1)
System.setProperty("javax.net.ssl.trustStore","/home/serverapp/BSS-cert.p12");
System.setProperty("javax.net.ssl.trustStorePassword","password");
System.setProperty("javax.net.ssl.trustStoreType","PKCS12");
Option 2)
Fichier de clés ks = fichier de clés.getInstance( "pkcs12" );
ks.load( new FileInputStream("/home/serverapp/SEV-cert.p12"), "mot de passe".toCharArray() );
KeyStore jks = KeyStore.getInstance( "JKS" );
jks.load( null );
KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" );
kmf.init( ks, "f0p6k9n2".toCharArray() );
TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" );
tmf.init( jks );
SSLContext ctx = SSLContext.getInstance( "TLS" );
ctx.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null );
Aussi, que j'ai pensé que peut être le problème était le service web, j'ai essayé d'instituer une connexion HTTPS, et il ne fonctionne pas avec le même message d'erreur lors de l'ouverture d'un flux d'entrée.
String httpsURL = "https://serverurl:443/theservice?wsdl";
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
InputStream ins = con.getInputStream(); //Exception here!
InputStreamReader isr = new InputStreamReader(ins);
BufferedReader in = new BufferedReader(isr);
Vous devez vous connecter pour publier un commentaire.
Deux approches communes ici:
http://ws.apache.org/xmlrpc/ssl.html
WebLogic a ses propres trucs:
http://download.oracle.com/docs/cd/E12840_01/wls/docs103/security/SSL_client.html#wp1029670
Je pense que vous avez à configurer, que le certificat non signé peut être digne de confiance. Peut-être cette va vous aider.
Dans le but de faire confiance à un certificat, vous avez à dire à java que vous faites confiance à l'autorité de certification qui a signé le cert. Dans le cas d'une auto-signé cert, qui est le cert lui-même. Vous devez définir le javax.net.le protocole ssl.trustStore système de la propriété d'un fichier de clés que contient l'autorité de certification pour la certification de du serveur auquel vous vous connectez.
Vous pouvez être en mesure d'obtenir le cert à partir de votre navigateur lorsque vous chercher à l'obtenir par le biais de la non fiables erreur de connexion. Essayez de trouver une option pour exporter le cert au format PKCS12, enregistrez ce fichier. Lorsque vous exécutez votre code, définir la javax.net.le protocole ssl.trustStore de propriété sur le fichier que vous venez d'enregistrer et également définir le javax.net.le protocole ssl.trustStoreType à PKCS12.
manque peut-être bon de certification SSL. Lire cette entrée de blog: http://blogs.oracle.com/andreas/entry/no_more_unable_to_find le programme donné ici m'a aidé une fois.