我有一个Spring Boot Microservice,在这里我试图调用一个外部服务器,该服务器公开一个HTTPS REST端点(TLS v1.2)。我已经获得了.pem格式的服务器端证书。
我想使用RestTemplate实现此调用,并使用提供的证书并在调用过程中验证主机名。
我已经尝试过对此进行搜索,并且所有搜索结果都试图忽略证书和主机名。
我可以有一个示例代码片段来正确实现吗?
答案 0 :(得分:0)
在研究了不同的博客和stackoverflow线程之后,以下对我有用:
创建休息模板:
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream(ResourceUtils.getFile(clientKeyPath)), "".toCharArray());
SSLContext sslContext = SSLContextBuilder
.create()
.loadKeyMaterial(keyStore, null)
.loadTrustMaterial(ResourceUtils.getFile(keystorePath), keystorePassword.toCharArray())
.build();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new CustomHostnameVerifier());
HttpClient client = HttpClients
.custom()
.setSSLSocketFactory(sslConnectionSocketFactory)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(client);
RestTemplate sslRestTemplate = new RestTemplate(requestFactory);
CustomHostnameVerifier的实现:
@Component
public class CustomHostnameVerifier implements HostnameVerifier {
@Value("${dns.name}")
private String dnsName;
@Override
public boolean verify(String hostname, SSLSession session) {
return hostname.equals(dnsName);
}
}