Pourquoi ne puis-je pas trouver le fichier de clés certifiées pour une négociation SSL?

J’utilise le modèle REST Spring du côté client pour passer des appels vers un sharepoint terminaison REST. Dans ce cas, le client est une application Spring et Tomcat est le conteneur de servlet.

Je rencontre des problèmes de connexion à un sharepoint terminaison HTTPS. Je reçois une erreur qui indique qu’il ne peut pas trouver un chemin valide vers le fichier de clés certifiées. Où puis-je spécifier cela? Cela est-il effectué au niveau du conteneur ou au niveau de la configuration de l’application (Spring)?

Trace de la stack:

org.springframework.web.client.ResourceAccessException: I/O error: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certificateion path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certificateion path to requested target org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:330) org.springframework.web.client.RestTemplate.execute(RestTemplate.java:292) org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:227) 

Vous devez configurer correctement le contexte SSLC, qui est externe au RESTTemplate. Cela devrait vous aider à démarrer:

  Ssortingng keystoreType = "JKS"; InputStream keystoreLocation = null; char [] keystorePassword = null; char [] keyPassword = null; KeyStore keystore = KeyStore.getInstance(keystoreType); keystore.load(keystoreLocation, keystorePassword); KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmfactory.init(keystore, keyPassword); InputStream truststoreLocation = null; char [] truststorePassword = null; Ssortingng truststoreType = "JKS"; KeyStore truststore = KeyStore.getInstance(truststoreType); truststore.load(truststoreLocation, truststorePassword); TrustManagerFactory tmfactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); KeyManager [] keymanagers = kmfactory.getKeyManagers(); TrustManager [] trustmanagers = tmfactory.getTrustManagers(); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(keymanagers, trustmanagers, new SecureRandom()); SSLContext.setDefault(sslContext); 

Plus précisément, l’appel de cette méthode fera l’affaire, de sorte que tout appel ultérieur à HttpClient ne se souciera pas de la validité du certificate SSL:

  public static void trustSelfSignedSSL() { try { SSLContext ctx = SSLContext.getInstance("TLS"); X509TrustManager tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] xcs, Ssortingng ssortingng) throws CertificateException { } public void checkServerTrusted(X509Certificate[] xcs, Ssortingng ssortingng) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } }; ctx.init(null, new TrustManager[]{tm}, null); SSLContext.setDefault(ctx); } catch (Exception ex) { ex.printStackTrace(); } }