如何使用Spring RestTemplate调用HTTPS宁静的Web服务
问题描述:
我正在使用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());
}
}
}
答
要么你需要在你的密钥库中的证书,或者您可以接受所有证书(一种关闭忽略证书验证)
所以,你可以重新定义休息模板的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。
谢谢你的回复。我尝试你的代码。在哪里jar文件我需要得到“TrustStragey”,“SSLConnectionFactory”。和SSLContents? – user1272936
这些是导入:javax.net.ssl.SSLContext,org.apache.http.conn.ssl.SSLConnectionSocketFactory,org.apache.http.conn.ssl.TrustStrategy。只需使用Apache HTTP客户端 – user1211
我遵循手册并添加了这段代码,但是我遇到了错误:'javax.net.ssl.SSLPeerUnverifiedException:的证书与任何主题替代名称不匹配:[]' –