Проверьте сертификат и имя хоста для вызова HTTPS REST с помощью Spring RestTemplate. - PullRequest
0 голосов
/ 23 октября 2019

У меня есть микросервис Spring Boot, где я пытаюсь вызвать внешний сервер, который предоставляет конечную точку REST HTTPS (TLS v1.2). Мне был предоставлен сертификат на стороне сервера в формате .pem.

Я хотел бы реализовать этот вызов с помощью RestTemplate, использовать предоставленный сертификат и проверить имя хоста во время вызова.

У меня естьпопробовал Google это и все результаты поиска пытаются игнорировать сертификат и имя хоста.

Могу ли я иметь пример кода, чтобы реализовать это правильно?

1 Ответ

0 голосов
/ 30 октября 2019

После некоторых копаний в разных блогах и потоках 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);
    }
}
...