Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

RestTemplate com certificado digital

Olá. Estou desenvolvendo uma API com Spring Boot e preciso utilizar o RestTemplate para consumir uma outra API que exige certificado digital. Eu possuo o certificado como arquivo, qual é a melhor forma de fazer isso utilizando RestTemplate e Spring Boot?

3 respostas
solução!

Exemplo para configurar um RestTemplate lendo um certificado digital. Neste exemplo, o certificado é armazenado em um arquivo PKCS12:

@Bean
public RestTemplate restTemplate() {
    KeyStore clientStore = KeyStore.getInstance("PKCS12");
    clientStore.load(new FileInputStream("/path/to/certfile"), "certpassword".toCharArray());

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

    SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build());
    CloseableHttpClient httpClient = HttpClients.custom()
            .setSSLSocketFactory(sslConnectionSocketFactory)
            .build();
    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
    requestFactory.setConnectTimeout(10000); // 10 seconds
    requestFactory.setReadTimeout(10000); // 10 seconds
    return new RestTemplate(requestFactory);
}

Olá Otávio, tudo bem? Eu usei esse código e referenciei um certificado com a extensão .p12 no new FileInputStream(). Estou recebendo esse erro como retorno: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target". Estou utilizando o certificado corretamente? Já tentei inserí-lo no "cacerts" da jvm também e nada mudou.

Oi Otávio, eu consegui descobrir que precisava de um outro certificado instalado no "/usr/lib/jvm/jdk-14.0.2/lib/security/cacerts". Consegui obter esse certificado através do programa Portecle. Depois de instalar esse outro certificado, foi possível realizar a requisição com essa implementação que você passou. Agora consigo realizar requisições com o RestTemplate passando certificados digitais junto com as requisições, muito obrigado.