ec2 - Problema con la redirección de HTTPS a HTTP por Elastic Load Balancer al servidor Tomcat
load balancer aws https (3)
Tuve un momento difícil para encontrar esto en la red y finalmente encontré la manera de hacerlo.
El problema era que, tan pronto como http redirigía al puerto https en ELB internamente, se redirigía al puerto 80 y se creaba 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 obtiene ahora que la solicitud de origen estaba usando SSL.
Esto se hace usando Tomcat Valves 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 tomcat conf b. Pega la siguiente línea justo debajo
<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
Nota: Esto habilitará la válvula globalmente. En caso de que esto deba habilitarse para un host específico, debe pegarse dentro de server.xml para ese dominio en particular
Paso 2:
a. Abra conf / server.xml b. Pega la siguiente línea justo arriba </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, entonces web.xml estará en webapps / ROOT / WEB-INF
segundo. Del mismo modo, si la aplicación está alojada en webapps / myappfolder, la web.xml estará en webapps / myappfolder / WEB-INF
do. 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]
Tengo un ELB (Amazon Elastic Load Balancer) configurado para equilibrar la carga de las solicitudes de los usuarios finales en HTTPS, en el back-end tengo mi aplicación ejecutándose en el servidor Tomcat que está configurado en HTTP.
Entonces, 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í?
Tuve un momento difícil para encontrar esto en la red y finalmente encontré la manera de hacerlo.
El problema era que, tan pronto como http redirigía al puerto https en ELB internamente, se redirigía al puerto 80 y se creaba 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 obtiene ahora que la solicitud de origen estaba usando SSL.
Esto se hace usando Tomcat Valves 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 tomcat conf b. Pega la siguiente línea justo debajo
<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
Nota: Esto habilitará la válvula globalmente. En caso de que esto deba habilitarse para un host específico, debe pegarse dentro de server.xml para ese dominio en particular
Paso 2:
a. Abra conf / server.xml b. Pega la siguiente línea justo arriba de la etiqueta </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, entonces web.xml estará en webapps / ROOT / WEB-INF
segundo. Del mismo modo, si la aplicación está alojada en webapps / myappfolder, la web.xml estará en webapps / myappfolder / WEB-INF
do. 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]
ELB establece un encabezado X-Forwarded-Proto
que le permite indicar qué protocolo utilizó el cliente para conectarse a su equilibrador de carga. Ver la documentación .
Puede configurar la seguridad de primavera para mirar este encabezado; consulte esta respuesta, por ejemplo.