Met excpetion when try to call one https service during different cloud server, pasted below error details:
xxxx error: I/O error on GET request for \"https://xxxxxxxxx/documents/document/docs/form": Certificate for <xxxxxxxxx> doesn't match any of the subject alternative names: []; nested exception is javax.net.ssl.SSLPeerUnverifiedException: Certificate for </xxxxxxxxx/> doesn't match any of the subject alternative names
Root casue: Sometimes, when we are using RestTemplate to make a call to a HTTPS endpoint, we can run into certificate issue. Doing the SSL check is the default behavior of the RestTemplate.
Solusion: This is MS to MS calling, if source or destination have the certificate validation, then the handshake will failed, so I disable the hostname validation from consumer end.
Please find my code for remove the validation:
create restTemplateWithoutHostnameVerifier:
@Bean(name = "restTemplateWithoutHostnameVerifier")
public RestTemplate RestTemplateWithoutHostnameVerifier() throws Exception {
HttpComponentsClientHttpRequestFactory hcchrf = null;
hcchrf = new HttpComponentsClientHttpRequestFactory(createHttpClientWithoutHostnameVirify());
hcchrf.setConnectTimeout(connectionTimeout);
hcchrf.setReadTimeout(readTimeout);
return new RestTemplate(hcchrf);
}
createHttpClientWithoutHostnameVirify method():
private HttpClient createHttpClientWithoutHostnameVirify() throws Exception {
HttpClientBuilder httpClientBuilder = createHttpClientBuilder(NoopHostnameVerifier.INSTANCE);
return httpClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build();
}
use the restTemplate when calling sevice it will disable the validation:
@Autowired
@Qualifier("restTemplateWithoutHostnameVerifier")
RestTemplate restTemplateWithoutHostnameVerifier;
public DocData getDocument() throws Exception {
response = restTemplateWithoutHostnameVerifier.exchange(xxxxxx);
}