es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo asegurar Spring Cloud Gateway con un certificado SSL utilizando Aws ELB.

Actualmente, tengo una instancia de ec2 que utilizo como un servidor de desarrollo/pruebas, ejecutando varios microservicios.

En frente de estos servicios, tengo un gateway de Spring Cloud que enruta el tráfico hacia los diferentes servicios.

En frente de la instancia de ec2, tengo un balanceador de carga de aplicaciones (ELB) configurado con AWS y con un certificado adjunto proporcionado por AWS Certificate Manager (dominio alojado en GoDaddy).

Todo esto está bien y funciona perfectamente si HTTPS no está configurado en el balanceador de carga, pero una vez que cambio a HTTPS en el balanceador de carga, obtengo:

502 Bad Gateway

En los registros del gateway, obtengo la siguiente excepción:

decoding failed: DefaultFullHttpRequest(decodeResult: failure(java.lang.IllegalArgumentException: text is empty (possibly HTTP/0.9)), version: HTTP/1.0, content: UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 0, cap: 0))
GET /bad-request HTTP/1.0 :

Después de buscar un poco, descubrí que tienes que habilitar explícitamente SSL usando:

server:
  ssl:
    enabled: true

Pero una vez que hago eso, parece que requiere el resto de los detalles, ya que obtengo lo siguiente:

org.springframework.boot.web.server.WebServerException: Could not load key store ‘null’

Según entiendo, debes cargar el certificado en el almacén de certificados de la JVM, pero el problema es que, hasta donde sé, no puedes exportar el certificado proporcionado por AWS Cert Manager.

Anteriormente hice exactamente lo mismo para un entorno de dot-net-core y no tuve ningún problema (quizás porque tenía un servidor web en ejecución dentro de la misma imagen de Docker). No estoy seguro de cómo proceder en Java. Tal vez mi enfoque es incorrecto y esta arquitectura no puede funcionar.

Por favor, ayúdame a señalar mi problema o sugerir una solución, ya que he agotado todas mis opciones.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución:

    El problema parece estar relacionado con la habilitación de SSL en el servidor Spring Cloud Gateway. La habilitación de SSL requiere configurar certificados SSL que se puedan utilizar para cifrar y descifrar el tráfico de HTTPS. En el entorno de AWS, AWS Certificate Manager proporciona certificados SSL, pero parece que estos certificados no son compatibles con Spring Cloud Gateway.

    Para resolver esto, puedes probar las siguientes opciones:

    1. Utilizar un certificado SSL personalizado: En lugar de utilizar AWS Certificate Manager, puedes adquirir o generar un certificado SSL personalizado y cargarlo en la instancia EC2. Luego puedes configurar Spring Cloud Gateway para que utilice este certificado.
    2. Utilizar un enfoque diferente para la terminación de SSL: En lugar de terminar SSL en el nivel del ALB, puedes terminar SSL en el nivel de la instancia EC2. En este enfoque, el ALB envía tráfico a la instancia EC2 a través de HTTP y la instancia EC2 maneja la terminación de SSL. Luego puedes configurar Spring Cloud Gateway para que funcione con tráfico HTTP.

    3. Utilizar un balanceador de carga diferente: En lugar de utilizar ALB, puedes probar a utilizar Elastic Load Balancer (ELB) o Network Load Balancer (NLB) en modo TCP. En este modo, la terminación de SSL se realiza a nivel de la instancia EC2 y Spring Cloud Gateway puede manejar el tráfico HTTP.

    Una vez que hayas decidido sobre un enfoque, deberás configurar Spring Cloud Gateway para que funcione con SSL. Puedes hacer esto agregando la configuración SSL necesaria al archivo application.yml de Spring Cloud Gateway. Aquí hay un ejemplo:

    [yml]
    server:
    ssl:
    enabled: true
    key-store-type: PKCS12
    key-store: classpath:keystore.p12
    key-store-password: secret
    key-password: secret

    Esta configuración habilita SSL, especifica el tipo y la ubicación del almacén de claves, y establece las contraseñas del almacén de claves y de la clave. Deberás reemplazar la ubicación del almacén de claves y las contraseñas con los valores apropiados para tu entorno.

    Espero que esto te ayude a resolver el problema. Si tienes alguna otra pregunta, no dudes en preguntar. ¡Buena suerte!

Comments are closed.