Je développe une Java application qui se connecte à SOAP services exposés à https://ut.eurodw.eu/ ( environnement de test pour European Datawarehouse). Je travaille sur ma machine de développement, récemment reformatée avec Windows 8.1. Aujourd'hui, j'ai essayé de leur envoyer une demande de création via SOAP de mon programme et j'ai obtenu cette erreur :
Caused by: javax.xml.ws.WebServiceException: Could not send Message.
at org.Apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.Java:146)
at com.Sun.proxy.$Proxy110.createDeal(Unknown Source)
at it.csttech.edwin.services.spring.EdwinServiceImpl.createDeal(EdwinServiceImpl.Java:102)
at it.csttech.edwin.consumercredit.data.managers.spring.DealManagerImpl.createEdCode(DealManagerImpl.Java:319)
... 77 more
Caused by: javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking https://ut.eurodw.eu/edservices/2.2/DealService.svc: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:57)
at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
at Java.lang.reflect.Constructor.newInstance(Constructor.Java:526)
at org.Apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.Java:1339)
at org.Apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.Java:1323)
at org.Apache.cxf.transport.AbstractConduit.close(AbstractConduit.Java:56)
at org.Apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.Java:628)
at org.Apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.Java:62)
at org.Apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.Java:272)
at org.Apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.Java:565)
at org.Apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.Java:474)
at org.Apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.Java:377)
at org.Apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.Java:330)
at org.Apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.Java:96)
at org.Apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.Java:135)
... 80 more
Caused by: javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at Sun.security.ssl.Alerts.getSSLException(Alerts.Java:192)
at Sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.Java:1884)
at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:276)
at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:270)
at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1341)
at Sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.Java:153)
at Sun.security.ssl.Handshaker.processLoop(Handshaker.Java:868)
at Sun.security.ssl.Handshaker.process_record(Handshaker.Java:804)
at Sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:1016)
at Sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1312)
at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1339)
at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1323)
at Sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.Java:563)
at Sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.Java:185)
at Sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.Java:1091)
at Sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.Java:250)
at org.Apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.Java:174)
at org.Apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.Java:1283)
at org.Apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.Java:1239)
at org.Apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.Java:201)
at org.Apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.Java:47)
at org.Apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.Java:69)
at org.Apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.Java:1296)
... 90 more
Caused by: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:385)
at Sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.Java:292)
at Sun.security.validator.Validator.validate(Validator.Java:260)
at Sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.Java:326)
at Sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.Java:231)
at Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:126)
at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1323)
... 108 more
Caused by: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at Sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.Java:196)
at Java.security.cert.CertPathBuilder.build(CertPathBuilder.Java:268)
at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:380)
... 114 more
Comme vous pouvez le voir en cliquant sur mon lien ci-dessus, ce n'est pas un certificat auto-signé, mais publié par GoDaddy public CA, reconnu par mon navigateur Firefox. Ma Java est 1.7.0_60-b19
. Ce sera une mauvaise idée de modifier le code afin de permettre des connexions SSL non sécurisées.
Je voudrais plutôt m'assurer que le certificat d'Eurodw est dans le Trust Store. Comment puis-je vérifier cela? Et comment puis-je éventuellement importer un nouveau certificat?
PS Je ne peux pas actuellement tester sur le serveur où l'application finale est déployée: je ne peux utiliser que ma propre installation Tomcat.
Les différents certificats se trouvent dans le magasin de clés suivant:
% Java_HOME%/jre/lib/security/cacerts
Si vous souhaitez répertorier les certificats approuvés:
keytool -list -keystore %Java_HOME%/jre/lib/security/cacerts
Le mot de passe est facultatif à lister.
Si vous souhaitez ajouter une entrée:
Tout d'abord, exportez le certificat à importer, disons que ce sera c:\cert.crt. La meilleure façon de le faire est d'utiliser Firefox, de faire un clic droit sur l'image de verrouillage dans l'URL, et après quelques clics, vous avez une fonction d'exportation.
Tapez ensuite:
keytool -import -alias my-cert -file c:\cert.crt -keystore %Java_HOME%/jre/lib/security/cacerts
Le mot de passe est: changeit
L'alias étant une étiquette définie par l'utilisateur, choisissez-la judicieusement, pour vous souvenir si vous en avez besoin un jour, de quoi il s'agissait.
Avec tout cela, vous devriez pouvoir faire confiance au certificat et tout fonctionner à nouveau.