9

Tengo un ELB (Amazon Elastic Load Balancer) configurado para cargar las solicitudes de saldo de los usuarios finales en HTTPS, en el backend tengo mi aplicación ejecutándose en el servidor Tomcat que está configurado en HTTP.Problema con la redirección de HTTPS a HTTP de Elastic Load Balancer al servidor de Tomcat

Así que cuando mis usuarios finales hagan una solicitud a la aplicación, la solicitud estará en HTTPS, ya que tienen acceso al ELB, ahora, ELB lo redirige internamente en HTTP al servidor de tomcat. En tomcat mi aplicación está protegida a través de Spring Security y si la solicitud es para un recurso protegido y el usuario no está conectado, el usuario se redirige a la página de inicio de sesión configurada. Ahora, esta redirección al usuario final será a través de HTTP, ya que el servidor tomcat recibió la solicitud originalmente del ELB como HTTP. Esto ahora conducirá a un 404 ya que no he configurado para el tráfico hacia adentro en HTTP.

¿Cómo resolvemos este problema? ¿Es la única opción para tener HTTPS tanto en el usuario final-ELB como en ELB-tomcat o me falta algo aquí?

Respuesta

9

ELB establece un encabezado X-Forwarded-Proto que le permite indicar qué protocolo utilizó el cliente para conectarse a su equilibrador de carga. Vea el documentation.

Puede configurar la seguridad de primavera para mirar este encabezado, vea this answer por ejemplo.

+1

Muchas gracias ... Resolvió mi problema .. –

0

Tuve un momento difícil para encontrar esto en la red y finalmente encontré la manera de hacerlo.

El problema fue que, tan pronto como http redirigía al puerto https en ELB internamente, solía redirigirse al puerto 80 creando así un bucle. Esto sucede porque ELB descarga el SSL y luego se conecta al puerto 80 nuevamente.

Finalmente después de algunas investigaciones obtuve la regla de reescritura correcta para administrar X-Forwarded-Proto de tal manera que incluso si ELB descarga el tomcat de SSL llega a que la solicitud de origen estaba usando SSL.

Esto se hace usando las válvulas Tomcat en Tomcat 8. Estoy seguro de que también se puede hacer en versiones anteriores. He habilitado reglas de reescritura en Tomcat usando válvulas. Después de eso, fue tan simple como escribir reglas de redirección en Apache.

Estos son los pasos:

Paso 1:

a. Abra context.xml debajo de la carpeta conf de tomcat b. Pegue la siguiente línea justo debajo de

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> 

Nota: Esto habilitará la válvula a nivel mundial. En caso de que esto tiene que estar habilitado para host específico, entonces debe ser pegado dentro de la de server.xml para ese dominio en particular

Paso 2:

a. Abra conf/server.xml b. Pegar la siguiente línea justo por encima de </Host>

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> 

Paso 3:

a. Abra la carpeta donde está web.xml. Por ejemplo, si la aplicación está alojada en ROOT y luego en la web.xml estará en webapps/ROOT/WEB-INF

b. Del mismo modo, si la aplicación está alojada bajo webapps/MyAppFolder entonces el web.xml estará bajo webapps/MyAppFolder/WEB-INF

c. En la carpeta WEB-INF Cree un nuevo archivo rewrite.config. y pegue la siguiente regla de reescritura:

RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteCond %{HTTPS} off 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] 
Cuestiones relacionadas