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

时间:2019-10-23 12:55:40

标签: spring-boot https ssl-certificate resttemplate tls1.2

我有一个Spring Boot Microservice,在这里我试图调用一个外部服务器,该服务器公开一个HTTPS REST端点(TLS v1.2)。我已经获得了.pem格式的服务器端证书。

我想使用RestTemplate实现此调用,并使用提供的证书并在调用过程中验证主机名。

我已经尝试过对此进行搜索,并且所有搜索结果都试图忽略证书和主机名。

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

1 个答案:

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