2017-02-19 168 views
3

我正在使用Tomcat7,Spring框架进行ReST Web服务。 我正在尝试使用Spring RestTemplate调用https Web服务。 我收到以下错误:如何使用Spring RestTemplate调用HTTPS宁静的Web服务

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

我在计算器在网上查询。我尝试从网址的示例代码: Access Https Rest Service using Spring RestTemplate

我无法让它工作。 任何人都可以根据下面的代码告诉我我需要改变什么? 也可以有人告诉我或提供我需要java库的pom.xml文件吗?

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


     } 

回答

6

要么你需要在你的密钥库中的证书,或者您可以接受所有证书(一种关闭忽略证书验证)

所以,你可以重新定义休息模板的bean作为

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

除了apache核心,客户端和依赖关系之外,您不需要额外的jar。

+0

谢谢你的回复。我尝试你的代码。在哪里jar文件我需要得到“TrustStragey”,“SSLConnectionFactory”。和SSLContents? – user1272936

+0

这些是导入:javax.net.ssl.SSLContext,org.apache.http.conn.ssl.SSLConnectionSocketFactory,org.apache.http.conn.ssl.TrustStrategy。只需使用Apache HTTP客户端 – user1211

+0

我遵循手册并添加了这段代码,但是我遇到了错误:'javax.net.ssl.SSLPeerUnverifiedException:<192.168.1.2>的证书与任何主题替代名称不匹配:[]' –