使用 Spring RestTemplate 验证 HTTPS REST 调用的证书和主机名

Verify Certificate and Hostname for an HTTPS REST call with Spring RestTemplate

我有一个 Spring 引导微服务,我试图在其中调用公开 HTTPS REST 端点 (TLS v1.2) 的外部服务器。我已获得 .pem 格式的服务器端证书。

我想使用 RestTemplate 实现此调用并使用提供的证书并在调用期间验证主机名。

我已经尝试 Google 这个并且所有搜索结果都试图忽略证书和主机名。

我可以提供一个示例代码片段来正确实现吗?

在对不同的博客和 Whosebug 线程进行一些挖掘之后,以下对我有用:

创建休息模板:

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