Использование файла .p12 для SSL - Использование Spring Boot - PullRequest
0 голосов
/ 10 марта 2020

Я хочу подключиться к защищенной конечной точке сервера. Поставщик услуг предоставил мне файл .p12 и пароль. Я попробовал вызов API на почтальоне после добавления сертификата в settings -> сертификаты -> клиентские сертификаты , и это было успешно.

Теперь я хочу интегрировать это в мой java код Я разрабатываю это приложение, используя Spring boot, и я следовал нескольким руководствам для этого. Я добавил файл .p12 в хранилище ключей с помощью этой команды.

keytool -importkeystore -srckeystore uat_client.p12 -destkeystore store.keys -srcstoretype pkcs12 -alias myownkeyname 

Но каждый раз, когда я получаю "No SSL Client «Сертификат предоставлен», что является тем же ответом, который я получил, когда не добавил сертификат в почтальон.

Я знаю, что это не идеальный способ обратиться за помощью, поскольку у меня нет большого количества кода для показа. Я очень новичок в этой области java. Я просто прошу какого-то гида. Если у меня есть файл .p12, какие шаги необходимо выполнить для успешного подключения к службе.

public void someMethod()
{
    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders httpHeaders = new HttpHeaders();

    String uri = "https://xx.net/api/v2/somemethod";

    httpHeaders.setContentType(MediaType.APPLICATION_JSON);

    String result = restTemplate.getForObject(uri, String.class);

    System.out.println("Result " + result);
}

1 Ответ

0 голосов
/ 10 марта 2020

Чтобы настроить Spring RestTemplate на использование сертификации клиента в соединении HTTPS, выполните следующие действия:

@Bean
public RestTemplate restTemplate() {
    KeyStore clientStore = KeyStore.getInstance("PKCS12");
    clientStore.load(new FileInputStream("certfile-path"), "certificate-password".toCharArray());

    SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
    sslContextBuilder.useProtocol("TLS");
    sslContextBuilder.loadKeyMaterial(clientStore, "certificate-password".toCharArray());
    sslContextBuilder.loadTrustMaterial(new TrustSelfSignedStrategy());

    SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build());
    CloseableHttpClient httpClient = HttpClients.custom()
            .setSSLSocketFactory(sslConnectionSocketFactory)
            .build();
    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
    return new RestTemplate(requestFactory);
}

и Inject restTemplate для использования:

@Autowired
RestTemplate restTemplate;

public void someMethod() {
    HttpHeaders httpHeaders = new HttpHeaders();
    String uri = "https://xx.net/api/v2/somemethod";
    httpHeaders.setContentType(MediaType.APPLICATION_JSON);
    String result = restTemplate.getForObject(uri, String.class);
    System.out.println("Result " + result);
}

Это оно. Надеюсь, что это решено.

...