Ir al contenido

Configurando un Cliente Web de Java para Solicitudes HTTPS

WebClient HTTPS Spring
Autor
Harpal Singh
Software Engineer
Traducido por
Namastecode
Tabla de contenido

1. Introducción

En este breve tutorial, configuraremos un WebClient de Spring para solicitudes HTTPS.

Asegurar la comunicación HTTP con cifrado dificulta que los atacantes manipulen los datos de los usuarios. Hoy en día, es la configuración predeterminada para la mayoría de las aplicaciones modernas que se integran con otros servicios.

En esta guía, comenzaremos con la verificación de un archivo de certificado y clave, y luego pasaremos a configurar Spring WebClient.

2. Verificando Archivos de Certificado y Clave

Primero, verificaremos que nuestro certificado y archivo de clave tengan el mismo MD5. Hacer esto asegura que el certificado y la clave no han sido modificados.

Podemos usar openssl para mostrar el hash MD5:

openssl x509 -noout -modulus -in yourCertificate.crt | openssl md5

De manera similar, podemos hacer lo mismo para el archivo clave:

openssl rsa -noout -modulus -in yourPrivateKey.key | openssl md5

Las salidas coincidentes de ambos comandos confirman que su certificado y clave están alineados.

Podemos probar el certificado y la clave con un CURL:

curl -v --cert yourCertificate.crt --key yourPrivateKey.key https://yourEndpoint.com

Ahora, podemos pasar a convertir el certificado y la clave al formato PKCS12.

3. Convertir el Certificado y la Clave al Formato PKCS12

Para configurar Spring WebClient, necesitamos convertir el certificado al formato PKCS12.

Nuevamente, utilicemos openssl para obtener el archivo en formato PKCS12:

openssl pkcs12 -export -in yourCertificate.crt -inkey yourPrivateKey.key -out certificate.p12

Ejecutar el comando anterior nos pedirá que creemos una contraseña. Introduzcamos una de nuestra elección y guardémosla en un lugar seguro, ya que la reutilizaremos al configurar el SslContext para el WebClient.

Ahora, tenemos un archivo certificate.p12 que podemos utilizar para configurar nuestra aplicación.

4. Configurando el SSLContext

Finalmente, podemos crear un SslContext que lea el archivo que creamos anteriormente, junto con la contraseña que establecimos.

Usaremos el SslContextBuilder para crear el SslContext:

SslContext sslContext = SslContextBuilder.forClient().keyManager(
    new FileInputStream("pathToP12CertificateFile"),
    "password".toCharArray()).build();

Ahora, el sslContext se puede utilizar para crear un bean de WebClient que puede realizar llamadas seguras HTTPS:

@Bean
private WebClient getSecureWebClient() {
    HttpClient httpClient = HttpClient.create().secure(sslSpec -> sslSpec.sslContext(getSSLContext()));
    ClientHttpConnector clientHttpConnector = new ReactorClientHttpConnector(httpClient);
    return WebClient.builder()
            .clientConnector(clientHttpConnector)
            .build();
}

Usar este WebClient para realizar solicitudes HTTPS seguras es tan simple como inyectar el bean WebClient en nuestro servicio:

@Service
public class MyService {
    private final WebClient webClient;

    public MyService(WebClient webClient) {
        this.webClient = webClient;
    }

    public Mono<String> getSecureData() {
        return webClient.get()
                .uri("https://yourEndpoint.com")
                .retrieve()
                .bodyToMono(String.class);
    }
}

De hecho, no necesitamos hacer nada especial en nuestro servicio para realizar solicitudes HTTPS seguras. El bean WebClient que creamos se encargará de todo por nosotros.

5. Conclusión

En este tutorial, convertimos un archivo de certificado y clave al formato PKCS12 y configuramos un WebClient para realizar solicitudes HTTPS seguras. Finalmente, mostramos cómo podemos usar el WebClient para hacer solicitudes HTTPS seguras en nuestro servicio.

Relacionados

Cómo reintentar usando Restclient
Spring-Boot Restclient
Ejecutando PostgreSQL en un Contenedor Docker
DevOps Postgres Docker Database