elastic ec2 classic balancer aws apache mod-rewrite https amazon-web-services elastic-beanstalk

apache - ec2 - elastic beanstalk redirect http to https



Cómo forzar https en Beanstalk elástico? (16)

EDITAR: Aunque me encanta esta respuesta, ahora es muy antigua . AWS ha creado nuevos servicios (como el Administrador de certificados ) que hacen que parte de esta respuesta sea obsoleta. Además, usar la carpeta .ebextensions con Apache es una forma más limpia de manejar esta redirección como se explicó anteriormente.

Si aloja su sitio web en S3, algunas partes de esta respuesta pueden serle útiles.

Esto funcionó para mí:

  1. Suba el certificado a AWS utilizando el comando aws console. La estructura de comando es:

    aws iam upload-server-certificate --server-certificate-name CERTIFICATE_NAME --certificate-body "file://PATH_TO_CERTIFICATE.crt" --private-key "file://YOUR_PRIVATE_KEY.pem" --certificate-chain "file://YOUR_CERTIFICATE_CHAIN.ca-bundle" --path /cloudfront/

  2. En su aplicación Elastic Beanstalk, vaya a Configuración -> Nivel de red -> Equilibrio de carga y haga clic en el ícono de ajustes .

  3. Seleccione Secure listener port como 443 . Seleccione Protocolo como HTTPS . Seleccione CERTIFICATE_NAME del paso 2 para la identificación del certificado SSL . Guarde la configuración.

  4. Ve a tu consola . Haga clic en Instancias EC2 . Haga clic en Load Balancers . Haga clic a través de los equilibradores de carga. Haga clic en Instancias y desplácese hacia abajo para ver las instancias EC2 asignadas a ese equilibrador de carga. Si la instancia EC2 tiene el mismo nombre que su URL de aplicación (o algo parecido), tome nota del nombre DNS para el equilibrador de carga. Debe estar en el formato awseb-e-...

  5. Regresa a tu consola . Haga clic en CloudFront . Haga clic en Crear distribución . Seleccione una distribución web .

  6. Configure la distribución. Establezca su nombre de dominio de origen en el nombre DNS del equilibrador de carga que encontró en el paso 5 . Establezca la Política del protocolo del visor para redirigir HTTP a HTTPS . Establezca cadenas de consulta hacia adelante en . Establezca Nombres de dominio alternativos (CNAME) en la (s) URL (s) que desee usar para su aplicación. Establezca el Certificado SSL en CERTIFICATE_NAME que cargó en el paso 2 . Crea tu distribución

  7. Haga clic en su nombre de distribución en CloudFront. Haga clic en Orígenes , seleccione su origen y haga clic en Editar . Asegúrese de que su política de protocolo de origen sea Match Viewer . Regresa. Haga clic en Comportamientos , seleccione su origen y haga clic en Editar . Cambie los encabezados hacia adelante a la lista blanca y agregue host . Salvar.

Nota: también escribí una guía más larga .

Parece que no puedo forzar https en el nivel de uso libre de beanstalk elástico.

He intentado la siguiente sugerencia en Cómo forzar https en Amazon beanstalk elástico sin fallar el chequeo de salud

Usando esta regla de reescritura de Apache

RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{REQUEST_URI} !^/status$ RewriteCond %{REQUEST_URI} !^/version$ RewriteCond %{REQUEST_URI} !^/_hostmanager/ RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Cuando intento eso, las solicitudes http no se redireccionan a https como me gustaría. En cambio, la página http carga normalmente. También intenté usar el encabezado X-Forwarded-Port con el mismo resultado.

También probé la siguiente regla de reescritura

RewriteCond %{SERVER_PORT} 80 RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Y esta regla causa un bucle de redirección. Por lo tanto, parece que las reglas de reescritura de apache no captan los encabezados de Elastic Load Balancer X-Forwarded-Port y X-Forwarded-Proto, pero tampoco un bucle de redireccionamiento es lo que estoy buscando.

Por favor ayuda. Soy nuevo en AWS, Elastic Beanstalk y no estoy muy familiarizado con las reglas de Apache. No estoy muy seguro de a dónde ir desde aquí. Gracias.


¿Por qué no simplemente pones un archivo .htaccess en la carpeta raíz? De esta manera, simplemente puede probar y depurarlo. Y si lo incluye en .zip, se implementará automáticamente en todas las instancias nuevamente.

Simplemente use .htaccess :

RewriteEngine on RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]


Edición: la solución de Zags es más general y correcta. Lo recomiendo sobre el mío (que es específico para un env python)

Aquí hay una solución limpia y rápida que se me ocurrió que evita hackear wsgi.conf o usar CloudFront

En su .ebextensions / some_file.config:

# Redirect HTTP to HTTPS "/etc/httpd/conf.d/https_redirect.conf": mode: "000644" owner: root group: root content: | <Directory /opt/python/current/app/> RewriteEngine on RewriteCond %{HTTP:X-Forwarded-Proto} ^http$ RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </Directory>

Siento que esto es demasiado fácil, pero parece estar funcionando bien.

También tenga en cuenta que estoy redirigiendo explícitamente HTTP en lugar de "no HTTPS".


El más votado no funciona para mí. La directiva <If> solo funciona con Apache 2.4+, pero ElasticBeanstalk tiene la versión 2.2.x.

Entonces, siguiendo el mismo consejo que arriba. Crea un archivo llamado .ebextensions / https_rewrite.config con el siguiente contenido

files: "/etc/httpd/conf.d/ssl_rewrite.conf": mode: "000644" owner: root group: root content: | LoadModule rewrite_module modules/mod_rewrite.so RewriteEngine On # This will enable the Rewrite capabilities RewriteCond %{HTTPS} !=on # This checks to make sure the connection is not already HTTPS RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Esto parece funcionar para mí.

Sobre cómo construir este archivo en su archivo WAR, vea esta answer


En beanstalk elástico, puede agregar su configuración para que AWS sobrescriba la suya, le permitirá sobrescribir la configuración del servidor web y enviar su propia configuración.

Simplemente agregue el siguiente archivo en la ruta: .ebextensions / httpd / conf.d

Contenido del archivo:

<VirtualHost *:80> LoadModule rewrite_module modules/mod_rewrite.so RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://localhost:8080/ retry=0 ProxyPassReverse / http://localhost:8080/ ProxyPreserveHost on ErrorLog /var/log/httpd/elasticbeanstalk-error_log </VirtualHost>

La ''.ebextensions'' es la carpeta de configuración estándar en AWS y el resto solo apunta a qué archivo y carpeta desea sobrescribir. Si el archivo o la carpeta no existe, créelos.


Es trabajo para mí con el próximo comando:

RewriteCond %{HTTP:X-Forwarded-Port} !=443

y sin la comprobación de https:

RewriteCond %{HTTP:X-Forwarded-Proto} !https

Parece que ELB cambia el valor de X-Forwarded-Proto a http (incluso en protocolo TCP).


Esta respuesta supone que ya ha habilitado https en el grupo de seguridad del equilibrador de carga, agregó el certificado SSL al equilibrador de carga, agregó 443 a los puertos reenviados por el equilibrador de carga y señaló su nombre de dominio en el entorno Elastic Beanstalk con Route 53 (o servicio DNS equivalente).

NOTA: Esta respuesta es para entornos Elastic Beanstalk que usan Apache. También puede no funcionar para una implementación basada en Docker.

Todo lo que necesita hacer es agregar lo siguiente a uno de sus archivos .config en el directorio .ebextensions de su proyecto :

files: "/etc/httpd/conf.d/ssl_rewrite.conf": mode: "000644" owner: root group: root content: | RewriteEngine On <If "-n ''%{HTTP:X-Forwarded-Proto}'' && %{HTTP:X-Forwarded-Proto} != ''https''"> RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] </If>

Explicación

Esto es moderadamente directo hacia afuera fuera de Elastic Beanstalk. Por lo general, se agrega una regla de reescritura de Apache como la siguiente:

RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

O, si está detrás de un equilibrador de carga, como lo estamos en este caso:

RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Sin embargo, estas configuraciones solo funcionan dentro de un bloque <VirtualHost> . Cambiar el RewriteCond a un bloque <If> permite funcionar correctamente fuera de un bloque <VirtualHost> , lo que nos permite RewriteCond en un archivo de configuración de Apache independiente. Tenga en cuenta que la configuración estándar de Apache en CentOS (incluida la configuración en ElasticBeanstalk) incluye todos los archivos que coinciden con /etc/httpd/conf.d/*.conf , que coincide con la ruta del archivo donde estamos almacenando este archivo.

La parte -n ''%{HTTP:X-Forwarded-Proto}'' de la condición evita que redirija si no está detrás de un equilibrador de carga, lo que le permite tener una configuración compartida entre un entorno de producción con un equilibrador de carga y https, y un entorno intermedio que es instancia única y no tiene https. Esto no es necesario si está utilizando equilibradores de carga y https en todos sus entornos, pero no está de más tenerlo.

Las malas soluciones que he visto

He visto muchas soluciones malas para este problema, y ​​vale la pena analizarlas para comprender por qué esta solución es necesaria.

  1. Usar Cloudfront: algunas personas sugieren usar la configuración de Cloudfront que no está en caché frente a Elastic Beanstalk para hacer el redireccionamiento de HTTP a HTTPS. Esto agrega un servicio completamente nuevo (lo que agrega complejidad) que no es exactamente apropiado (Cloudfront es un CDN, no es la herramienta adecuada para forzar HTTPS en contenido inherentemente dinámico). La configuración de Apache es la solución normal a este problema y Elastic Beanstalk utiliza Apache, así que esa es la forma en que deberíamos ir.

  2. SSH en el servidor y ...: Esto es completamente antitético hasta el punto de Elastic Beanstalk y tiene tantos problemas. Las instancias nuevas creadas mediante autoescalado no tendrán la configuración modificada. Cualquier entorno clonado no tendrá la configuración. Cualquier cantidad de un conjunto razonable de cambios de entorno borrará la configuración. Esta es una mala idea.

  3. Sobrescriba la configuración de Apache con un nuevo archivo: esto se está metiendo en el ámbito correcto de la solución pero le deja con una pesadilla de mantenimiento si Elastic Beanstalk cambia aspectos de la configuración del servidor (que muy bien pueden hacer). También vea los problemas en el próximo artículo.

  4. Edite dinámicamente el archivo de configuración de Apache para agregar algunas líneas: esta es una buena idea. El problema con esto es que no funcionará si Elastic Beanstalk cambia alguna vez el nombre de su archivo de configuración de Apache predeterminado, y que este archivo puede sobrescribirse cuando menos lo espere: https://forums.aws.amazon.com/thread.jspa?threadID=163369


Estoy tratando de redirigir un Beanstalk elástico con loadbalancer en 2018. Ninguna de las respuestas anteriores funciona en mi entorno. Varios problemas que encontré:

  1. Estaba intentando la respuesta más votada, pero mi tomcat es la versión 2.7. No es compatible.

  2. Estaba usando container_commands y copio la configuración 00_applications. AWS simplemente lo ignora.

Así que finalmente lo conseguí trabajando leyendo esto: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-proxy.html

Esto es lo que hago:

Recreé la estructura de la carpeta:

.ebextensions - httpd -conf.d -ssl.conf

Y luego este es el contenido de ssl.conf

<VirtualHost *:80> RewriteEngine on RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] <Proxy *> Order Allow,Deny Allow from all </Proxy> ProxyPass / http://localhost:8080/ retry=0 ProxyPassReverse / http://localhost:8080/ ProxyPreserveHost on ErrorLog /var/log/httpd/elasticbeanstalk-error_log </VirtualHost>

Espero que esto ayude


Lo hemos resuelto en nuestro back X-Forwarded-Proto end manejando X-Forwarded-Proto correctamente.

Esta es nuestra configuración de Grails, pero te ayudará con la idea:

grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true grails.plugin.springsecurity.portMapper.httpPort = 80 grails.plugin.springsecurity.portMapper.httpsPort = 443 grails.plugin.springsecurity.secureChannel.secureHeaderName = ''X-Forwarded-Proto'' grails.plugin.springsecurity.secureChannel.secureHeaderValue = ''http'' grails.plugin.springsecurity.secureChannel.insecureHeaderName = ''X-Forwarded-Proto'' grails.plugin.springsecurity.secureChannel.insecureHeaderValue = ''https'' grails.plugin.springsecurity.secureChannel.definition = [ [pattern: ''/**'', access: ''REQUIRES_SECURE_CHANNEL''] ]


Ninguna de las respuestas anteriores funcionó para mí, pero algunas me ayudaron a descubrir la respuesta que funcionó para mí. También encontré la siguiente URL que ayudó a http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-platform.html

Creé la estructura de archivos mencionada en la url anterior para cambiar 2 archivos httpd.conf 00_application.conf

copie todo el httpd.conf de su instancia y póngalo en su código bajo .ebextention debajo de la estructura de carpetas mencionada en el enlace de arriba. Luego solo agrega la línea debajo de ese archivo en tu proyecto

LoadModule rewrite_module modules/mod_rewrite.so

Haga lo mismo para 00_application.conf, cópielo de su instancia y colóquelo en su base de código bajo .ebextention en httpd / conf.d / elasticbeanstalk / 00_application.conf Ahora edite este archivo y agregue lo siguiente entre VirtualHost

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

Ahora implementa tu código. Debería funcionar.


Para ampliar otras dos respuestas a esta pregunta, https://.com/a/42035023/8775205 , https://.com/a/42035023/8775205 . Para usuarios de arranque de primavera que despliegan sus servicios en AWS con ELB y necesitan una guía paso a paso, puede agregar un archivo ****. Conf en src / main / webapp / .ebextensions / httpd / conf.d / en su proyecto .

src --main ----java ----resources ----webapps ------.ebextensions --------httpd ----------confd ------------****.conf

****. conf se parece a lo siguiente. Noté que tengo mi sitio de prueba con una sola instancia, por lo que agrego una condición para excluirlo.

<VirtualHost *:80> LoadModule rewrite_module modules/mod_rewrite.so RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker RewriteCond %{HTTP_HOST} !testexample.com #excludes test site RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://localhost:8080/ retry=0 ProxyPassReverse / http://localhost:8080/ ProxyPreserveHost on ErrorLog /var/log/httpd/elasticbeanstalk-error_log </VirtualHost>

Después de esto, recuerde agregar un "recurso" bajo maven-war-plugin en su pom.xml para poder elegir la configuración anterior.

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <webResources> <resource> <!-- some other resource configured by yourself--> </resource> <resource> <directory>src/main/webapps/.ebextensions</directory> <targetPath>.ebextensions</targetPath> <filtering>true</filtering> </resource> </webResources> </configuration> <version>2.1.1</version> </plugin>

Finalmente, confirme y envíe su código, espere AWS codebuild y codepipeline para recoger su código de su repositorio y desplegarlo en el entorno beanstalk, o simplemente empacar su proyecto en un archivo war y cargarlo en su entorno AWS Beanstalk.



Tenga en cuenta que la respuesta más votada es un poco antigua ahora. La respuesta de A Paul es en realidad la respuesta correcta. El enlace proporcionado en su respuesta es por AWS (por lo que es el método recomendado para anular su configuración de Apache para hacer la redirección de HTTP a HTTPS cuando ejecuta su aplicación en Elastic Beanstalk).

Hay una cosa muy importante a tener en cuenta. Si está implementando más de 1 aplicación web, entonces agregar la carpeta .ebextensions dentro de una de su aplicación web no va a funcionar. Notará que ninguna de las configuraciones que especificó se está escribiendo o creando. Si está implementando varias aplicaciones web en el entorno de Elastic Beanstalk, necesitará leer este artículo de AWS Java Tomcat Implementar múltiples archivos WAR en Elastic Beanstalk

En general, deberá tener la siguiente estructura antes de emitir el comando eb para desplegar los archivos WAR:

MyApplication.zip ├── .ebextensions ├── foo.war ├── bar.war └── ROOT.war

si la carpeta .ebextentions existe dentro de cada archivo WAR, entonces observará que se ignora por completo y no se realizarán cambios en la configuración.

Espero que esto ayude a alguien más.


Tengo las siguientes configuraciones para beanstalk elástico (64 bits en Amazon Linux 2016.09 v2.3.1 con Tomcat 8 Java 8). Creé un directorio .ebextensions y agregué un archivo .config YAML con las condiciones de reescritura

La share Zagas descrita arriba (que es muy compleja) no funciona para mí.

  1. Porque la condición "Si" es desconocida
  2. Debido a Apache 2.2 no tengo mod_rewrite.so incluido en mi archivo httpd.conf

share tiene más sentido para mí, pero también esto no funciona. No sucede nada, y no puedo ver el archivo "ssl_rewrite.conf" en el directorio "conf.d".

La tercera solución probada fue agregar archivos "run.config" y "ssl_rewrite.conf" en el directorio ".ebextendsion".

run_config contiene

container_commands: copy-config: command: "cp .ebextensions/ssl_rewrite.conf /etc/httpd/conf.d"

ssl_rewrite.conf contiene

LoadModule rewrite_module modules/mod_rewrite.so RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

ssl_rewrite.conf se crea debajo de "conf.d" direcotry pero la redirección de http a https no funciona.

La única solución trabajada para mí fue agregar las siguientes líneas en "/etc/httpd/conf.d/elasticbeanstalk/00_application.conf"

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

pero esta es una solución temporal y si se reemplaza una máquina, mi redirección de https ya no está.


Tuve un momento difícil para resolver esto, así que después de que se me ocurrió una solución escribí una explicación detallada de mi solución para ayudar a alguien más. Esto es específico de las aplicaciones Tomcat 8, Apache2 y Spring Boot. Hay ejemplos de ebextension realmente útiles en AWS labs github .

Resumen de lo que funcionó para mí:

  1. Cree un archivo en /src/main/webapp/.ebextensions/httpd/conf.d/elasticbeanstalk.conf
  2. Agregue rescribir conds / rules teniendo cuidado de incluir "LoadModule rewrite_module modules / mod_rewrite.so"
  3. Implementar a AWS EBS

Aquí hay un ejemplo de la aplicación Spring Boot .


esta es una solución fácil

  1. ssh en su instancia de EC2
  2. copie el contenido de /etc/httpd/conf.d/wsgi.conf en un archivo local llamado wsgi.conf que se colocará en la carpeta base de su aplicación
  3. Edite la versión local de wsgi.conf y agregue las siguientes reglas de redirección dentro de las etiquetas <VirtualHost> </ VirtualHost>

    RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

  4. Cambia el "/ estado" a la página que estés utilizando como página de control de estado .

  5. Guarda el archivo
  6. Edite su archivo <app> .conf dentro de su. ebextensions directorio para agregar un comando contenedor para copiar esta versión de wsgi.conf sobre la versión de Amazon

    container_commands: 01_syncdb: command: "django-admin.py syncdb --noinput" leader_only: true 02_collectstatic: command: "django-admin.py collectstatic --noinput" 03_wsgireplace: command: ''cp wsgi.conf ../wsgi.conf'' ...

  7. Implementa el código.

  8. La versión implementada de wsg.conf en /etc/httd/conf.d/wsgi.conf ahora incluirá las reglas de redireccionamiento necesarias.

Debería funcionar y el archivo se actualizará correctamente para cada implementación. Lo único que hay que tener en cuenta es que si Amazon cambia el contenido de su archivo base wsgi.conf en el futuro, es posible que su copia ya no funcione.

Autor rickchristianson