How to call HTTPS restful web services using Spring RestTemplate

49,074

Either you need to have certificates in your keystore or you can accept all certificates (kind off ignore certificate validation)

So you can re-define bean of rest template as

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;
 }

You should not need additional jars except for apache core, client and dependencies.

Share:
49,074
user1272936
Author by

user1272936

Updated on July 09, 2022

Comments

  • user1272936
    user1272936 almost 2 years

    I am using Tomcat7, Spring framework for ReST web services. I am trying to call an https web service using Spring RestTemplate. I am getting the following error:

    unable to find valid certification 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 certification path to requested target

    I check online at stackoverflow. I tried the sample code from the url: Access Https Rest Service using Spring RestTemplate

    I couldn't get it to work. Can anybody please tell me based on the code below what do I need to change? Also can anybody tell me or provide me with the pom.xml file which java libraries would I need?

            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());
                    }
                }
    
    
            }