天天看点

resttemplate 调用https 出错 unable to find valid certification path to requested target

resttemplate 调用https使用下面代码:

@Bean

@Primary

public RestTemplate restTemplate(ClientHttpRequestFactory httpRequestFactory) {

return new RestTemplate(httpRequestFactory);

}

@Bean

public ClientHttpRequestFactory simpleClientHttpRequestFactory() {

SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();

//单位为ms

factory.setReadTimeout(10 * 1000);

factory.setConnectTimeout(30 * 1000);

return factory;

调用没有证书的https出现的错误

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://gateway.fat.demo.com/service-commodity/providerInventory/queryInventory": sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 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

修改为下面的java代码后,一切OK:

@Primary

public RestTemplate restTemplate() {

return new RestTemplate(generateHttpsRequestFactory());

public HttpComponentsClientHttpRequestFactory generateHttpsRequestFactory() {

try {

TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;

SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();

SSLConnectionSocketFactory connectionSocketFactory =

new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());

HttpClientBuilder httpClientBuilder = HttpClients.custom();

httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);

CloseableHttpClient httpClient = httpClientBuilder.build();

HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();

factory.setHttpClient(httpClient);

factory.setConnectTimeout(10 * 1000);

factory.setReadTimeout(30 * 1000);

return factory;

} catch (Exception e) {

log.error("创建HttpsRestTemplate失败", e);

throw new RuntimeException("创建HttpsRestTemplate失败", e);

}