Redirigir EC2 Elastic Load Balancer de HTTP a HTTPS

115

Quiero redirigir toda la solicitud HTTP a la solicitud https en ELB . Tengo dos instancias EC2. Estoy usando nginx para el servidor. He intentado reescribir los archivos conf de nginx sin éxito. Me encantaría recibir algunos consejos al respecto.

2
  • 1
    Parece que Internet no puede ponerse de acuerdo sobre una solución única, completa y funcional para este problema. Espero que pueda obtener ayuda aquí en mi publicación . Tuve que saltar a través de aros para llegar a esto, finalmente.
    ADTC
    12/11/2017 a las 0:08
  • 1
    Este ans tiene la última solución, no el anser aceptado
    AsifM
    22/02/19 a las 12:17
110

Los balanceadores de carga de aplicaciones de AWS ahora admiten el redireccionamiento nativo de HTTP a HTTPS.

Para habilitar esto en la consola, haga lo siguiente:

  1. Vaya a su Load Balancer en EC2 y pestaña "Listeners"
  2. Seleccione "Ver / editar reglas" en su escucha HTTP
  3. Eliminar todas las reglas excepto la predeterminada (abajo)
  4. Editar regla predeterminada: elija "Redirigir a" como acción, deje todo como predeterminado e ingrese "443" como puerto.

Regla de escucha de redireccionamiento nativo

Lo mismo se puede lograr utilizando la CLI como se describe aquí .

También es posible hacer esto en Cloudformation, donde necesita configurar un objeto Listener como este:

  HttpListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
      - Type: redirect 
        RedirectConfig:
          Protocol: HTTPS
          StatusCode: HTTP_301
          Port: 443

Si aún usa Classic Load Balancers, elija una de las configuraciones de NGINX descritas por los demás.

10
  • 1
    Muy útil saber que ahora es más fácil. Pero esta sería una mejor respuesta con más información sobre qué configurar en lugar de solo un enlace. 7/08/18 a las 20:20
  • 1
    @JohnRees editó la respuesta en consecuencia, espero que esto ayude
    Ulli
    9 de agosto de 2018 a las 8:13
  • Bonito. Te voté a favor para llevarte a cero. Tu mereces más. 9 de agosto de 2018 a las 9:26
  • 2
    @florian, parece que estás usando un Classic Load Balancer. Cambie a Application Load Balancer para obtener esa opción
    Ulli
    13/11/18 a las 8:09
  • ¿Cómo asigno el balanceador de carga de aplicaciones a mi instancia? (ya que no hay instancespestaña) 14/11/18 a las 18:14
108

ELB establece el X-Forwarded-Protoencabezado, puede usarlo para detectar si la solicitud original fue a HTTP y redirigir a HTTPS en ese momento.

Puedes probar esto en tu serverconf:

if ($http_x_forwarded_proto = 'http') {
    return 301 https://yourdomain.com$request_uri;
}

Eche un vistazo a los documentos de ELB .

17
  • 3
    ¿Dónde se hace esta configuración? 10/0316 a las 0:44
  • 2
    @ ericpeters0n el fragmento de la respuesta es para la nginxconfiguración, pero el principio es aplicable a cualquier servidor web. 10/03/2016 a las 9:26
  • 1
    Si está usando beanstalk con el pasajero independiente, siga este enlace para obtener instrucciones sobre cómo cambiar la configuración de nginx. qiita.com/tak_nishida/items/cf30a2d373744943b943
    Yeonho
    15/04/2016 a las 6:35
  • 3
    Asegúrese de tener oyentes HTTP y HTTPS en su balanceador de carga. 13 de mayo de 2016 a las 1:19
  • 1
    @Ronald, por server conf en la respuesta me refiero al servidor nginx en instancias ec2 que se ejecutan detrás de ELB. 30/01/19 a las 10:37
36

Tuve el mismo problema, en mi situación, HTTPS fue manejado completamente por ELB y no conocía mi dominio de origen antes de tiempo, así que terminé haciendo algo como:

server {
  listen 81;
  return 301 https://$host$request_uri;
}

server {
  listen 80;
  # regular server rules ...
}

Y luego, por supuesto, apuntar el ELB 'https' al puerto de instancia 80 y luego la ruta 'http' al puerto de instancia 81.

6
  • 3
    Esto es genial. 16 de febrero de 2017 a las 4:52
  • 2
    @CodyBugstein esta es la configuración de nginx, si tiene una
    timurso
    19/04/18 a las 13:59
  • @timurso si tienes uno, ¿qué? 20/04/18 a las 6:10
  • @CodyBugstein si tiene nginx frente a su aplicación (yo, por ejemplo, no lo hago, se enruta directamente a un contenedor que ejecuta ExpressJS)
    timurso
    20/04/18 a las 10:54
  • ¿A dónde iría el nginx? ¿Dentro del ELB? ¿Dentro del EC2? ¿Está esto configurado en Elastic Beanstalk en algún lugar? 20/04/18 a las 18:17
16

Amazon Elastic Load Balancer (ELB) admite un encabezado HTTP llamado X-FORWARDED-PROTO. Todas las solicitudes HTTPS que pasan por ELB tendrán el valor de X-FORWARDED-PROTO igual a “HTTPS”. Para las solicitudes HTTP, puede forzar HTTPS agregando la siguiente regla de reescritura simple. ¡Para mí funciona bien!

apache

Puede agregar las siguientes líneas en su archivo .htaccess:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}

O si usa vhost.conf para administrar varios dominios en el mismo servidor web EC2, puede agregar lo siguiente a vhost.conf (agréguelo al dominio que desea usar https para ello):

<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>

IIS

Instale el módulo IIS Url-Rewrite, usando la GUI de configuración agregue estas configuraciones:

<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
</rule>
</rules>
</rewrite>

Leer más aquí

3
  • Tuvimos el problema de que nuestra instancia redirigiera el tráfico http normal porque el encabezado ni siquiera estaba presente. Lo resuelvo haciendo la condición:RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$) 27/07/2016 a las 9:15
  • Esto está provocando redireccionamientos infinitos. Estoy usando IIS con el servidor de Windows. 25 de octubre de 2016 a las 4:56
  • @ It'satrap: para IIS, si no funcionó, pruebe el script en esta URL: stephen.genoprime.com/2012/01/01/aws-elb-ssl-with-iis.html 25/10/2016 a las 12:29
5

Las soluciones de htaccess anteriores provocaron que fallara la verificación de estado de ELB. Tuve algunos problemas para encontrar la solución hasta que descubrí un artículo en línea en el que alguien tenía los mismos problemas que yo. Su solución fue agregar esto al comienzo del archivo htaccess en su lugar:

RewriteEngine on 
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

To allow this and other local requests over HTTP while redirecting external requests through the ELB to HTTPS, adjust the rewrite condition to match on http instead of a negative match on https.

Fuente: redirección de HTTP a HTTPS con AWS y ELB

1
  • "ajustar la condición de reescritura para que coincida en http en lugar de una coincidencia negativa en https" esa es la parte que estaba tratando de corregir. ¡Gracias! 21/03/19 a las 21:12
4

Puede que no sea la solución que está buscando, pero otra opción podría ser utilizar AWS CloudFront además de ELB. CloudFront ofrece la opción de redirigir todo el tráfico HTTP entrante a HTTPS.

1
4

Basado en la respuesta de @ Ulli Si desea configurarlo usando Terraform , aquí hay un ejemplo>

resource "aws_alb_listener" "web" {
  load_balancer_arn = "${aws_alb.web.arn}"

  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

Fuente

3

Tuve un problema extraño con la configuración de nginx y ELB. Mi configuración incluía 3 servicios diferentes dentro de un nginx detrás de ELB. Y tuve un problema de contenido mixto: cuando su solicitud a ELB es https, pero solo dentro de ELB http, y el servidor crea una ruta relativa a estática usando http, por lo que el navegador falla con el problema de 'contenido mixto'. Y debo crear una solución para el trabajo de http / https sin redirecciones.

Aquí está la configuración ubicada en la nginx/conf.d/carpeta:

# Required for http/https switching
map $http_x_forwarded_port $switch {
  default   off;
  "80"    off;
  "443"   on;
}

Esto significa que conoceremos qué es el protocolo de cliente real. Como ves, lo tendremos en $switchvar. Y en este momento lo usa en todos los lugares donde lo necesita:

location ~ /softwareapi/index.php {
  fastcgi_param HTTPS $switch;
  .. other settings here ..
}

Con la configuración de HTTPS, la aplicación php detectará automáticamente el protocolo correcto y construirá cuidadosamente la ruta relativa para evitar problemas de contenido mixto.

Atentamente.

1

Acabo de pasar por el proceso y probé las redirecciones (desde el shell de instancia ec2) con el comando

curl -Iv [your url]

ej .: curl -Iv http://example.com

Requisito

  1. configurar la zona hospedada para DNS y el servidor de nombres en AWS Route 53
  2. obtener el certificado con AWS Certificate Manager
  3. agregue el oyente en el balanceador de carga para el puerto 443 elija el certificado de 2. y el SSL

Lo que hice fue:

  1. Redirigir http://yourwebsite.com -> https://www.yourwebsite.com (paso 2)
  2. Redirigir http://www.yourwebsite.com -> https://www.yourwebsite.com (paso 2)
  3. Redirigir https://yourwebsite.com -> https://www.yourwebsite.com (paso 3)

Pasos

1. Fue a Load Balancer

2. Vaya a Listener ID HTTP: 80 (haga clic en Ver / editar reglas debajo de la columna Reglas)

Editar acción predeterminada: (haga clic en el icono de lápiz en la parte superior, use Switch to full URL)

  1. cambie ENTONCES el bloque a Redirigir a https: //www.# {host}: 443 / # {ruta}? # {consulta}
  2. Código de estado: HTTP_301

Agregue una acción más (haga clic en + firmar en la parte superior)

  1. elija SI el encabezado del host del bloque es yourwebsite.com
  2. cambie ENTONCES el bloque a Redirigir a https: //www.# {host}: 443 / # {ruta}? # {consulta}
  3. Código de estado: HTTP_301

ingrese la descripción de la imagen aquí

3. Regrese y acceda a Listener ID HTTPS: 443 (haga clic en Ver / editar reglas)

Agregue una acción más (haga clic en + firmar en la parte superior)

  1. elija SI el encabezado del host del bloque es yourwebsite.com
  2. cambie ENTONCES el bloque a Redirigir a https: //www.# {host}: 443 / # {ruta}? # {consulta}
  3. Código de estado: HTTP_301

No edite la acción predeterminada en HTTPS

ingrese la descripción de la imagen aquí

1
  • ¡brillante! gracias 23 de agosto a las 16:56
-2

Cree un archivo .ebextensions/00_forward_http_to_https.configcon el siguiente contenido:

files: 
  /tmp/deployment/http_redirect.sh:
    mode: "000755"
    content: |
      APP_URL=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'APP_URL: \K([^\s)\"](?!ttp:))+'`
      sed -ie '[email protected]$proxy_add_x_forwarded_for;@$proxy_add_x_forwarded_for;\n        if ($http_x_forwarded_proto = 'http') { return 301 https://'"$APP_URL"'$request_uri; }@' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

container_commands:
  http_redirect:
    command: "/tmp/deployment/http_redirect.sh"

Asegúrese de configurar la variable de entorno APP_URL desde la consola de administración de AWS de antemano.

2
  • ¿Cómo puedo hacer esto al equilibrar las conexiones TCP con ELB?
    boom
    27 de julio de 2016 a las 4:37
  • 1
    No veo dónde se ajusta su respuesta a la pregunta ... está hablando de un tallo de frijol elástico y la pregunta es sobre nginx dentro de un EC2. 15/08/2016 a las 19:29