web-dev-qa-db-fra.com

Comment appeler des services Web reposants HTTPS à l'aide de Spring RestTemplate

J'utilise Tomcat7, framework Spring pour les services Web ReST. J'essaie d'appeler un service Web https en utilisant Spring RestTemplate . Je reçois l'erreur suivante:

impossible de trouver un chemin de certification valide vers la cible demandée; l'exception imbriquée est javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: échec de la création du chemin PKIX: Sun.security.provider.certpath.SunCertPathBuilderException: impossible de trouver un chemin de certification valide vers la cible demandée

Je vérifie en ligne sur stackoverflow. J'ai essayé l'exemple de code à partir de l'URL: Access Https Rest Service en utilisant Spring RestTemplate

Je ne pouvais pas le faire fonctionner. Quelqu'un peut-il me dire en fonction du code ci-dessous ce que je dois changer? Quelqu'un peut-il me dire ou me fournir le fichier pom.xml dont Java bibliothèques aurais-je besoin?

        import org.springframework.web.bind.annotation.RequestMethod;
        import org.springframework.web.client.RestTemplate;

        import com.fasterxml.jackson.core.JsonGenerationException;
        import com.fasterxml.jackson.databind.JsonMappingException;
        import com.fasterxml.jackson.databind.ObjectMapper;
        import com.journaldev.spring.controller.EmpRestURIConstants;
        import com.journaldev.spring.model.CostControlPost;
        import com.journaldev.spring.model.Employee;
        import com.journaldev.spring.model.RfxForUpdate;

        import static org.junit.Assert.*;
        import org.Apache.commons.codec.binary.Base64;


        import javax.net.ssl.*;
        import Java.io.*;
        import Java.security.KeyStore;
        import Java.security.MessageDigest;
        import Java.security.cert.CertificateException;
        import Java.security.cert.X509Certificate;


        public class TestExample2
        {
            public static final String SERVER_LIST="https://abc/sourcing/testServices";


            @Test
            public void testGetListOfServiceNames()
            {
                try
                {


                    RestTemplate restTemplate = new RestTemplate();
                    ResponseEntity<String> response = restTemplate.exchange(SERVER_LIST,HttpMethod.GET,null,String.class);
                    assertNotNull(response);    
                }
                catch(Exception e)
                {
                    System.out.println("e:"+e.getMessage());
                }
            }


        }
12
user1272936

Soit vous devez avoir des certificats dans votre magasin de clés, soit vous pouvez accepter tous les certificats (désactivez ignorer la validation des certificats)

Vous pouvez donc redéfinir le modèle de haricot de repos comme

import javax.net.ssl.SSLContext;
import org.Apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.Apache.http.conn.ssl.TrustStrategy;
import Java.security.cert.X509Certificate;

@Bean
public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
    TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;

    SSLContext sslContext = org.Apache.http.ssl.SSLContexts.custom()
                    .loadTrustMaterial(null, acceptingTrustStrategy)
                    .build();

    SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);

    CloseableHttpClient httpClient = HttpClients.custom()
                    .setSSLSocketFactory(csf)
                    .build();

    HttpComponentsClientHttpRequestFactory requestFactory =
                    new HttpComponentsClientHttpRequestFactory();

    requestFactory.setHttpClient(httpClient);
    RestTemplate restTemplate = new RestTemplate(requestFactory);
    return restTemplate;
 }

Vous ne devriez pas avoir besoin de fichiers jars supplémentaires, à l'exception du noyau Apache, du client et des dépendances.

17
user1211