Parece que no puedo forzar https en el nivel de uso gratuito de elastic beanstalk.
Probé la siguiente sugerencia en Cómo forzar https en amazon elastic beanstalk sin fallar la verificación de estado
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 redirigen a https como me gustaría. En cambio, la página http se carga normalmente. También intenté usar el encabezado X-Fordered-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 provoca un bucle de redireccionamiento. Por lo tanto, parece que las reglas de reescritura de Apache no recogen los encabezados de Elastic Load Balancer X-Fordered-Port y X-Fordered-Proto, pero tampoco un bucle de redireccionamiento tampoco es lo que busco.
Por favor ayuda. Soy nuevo en AWS, Elastic Beanstalk y no estoy muy familiarizado con las reglas de Apache. No estoy muy seguro de adónde ir desde aquí. Gracias.
fuente
Respuestas:
Esta respuesta supone que ya habilitó https en el grupo de seguridad del balanceador de carga, agregó el certificado SSL al balanceador de carga, el balanceador de carga reenvió los puertos 80 y 443 y apuntó su nombre de dominio al entorno Elastic Beanstalk con Route 53 (o servicio DNS equivalente).
NOTA: Esta respuesta es para entornos de Elastic Beanstalk que usan Apache. Es posible que no funcione para una implementación basada en Docker.
Todo lo que necesita hacer es agregar lo siguiente a uno de sus
.config
archivos en el.ebextensions
directorio de su proyecto :Explicación
Esto es moderadamente sencillo fuera de Elastic Beanstalk. Por lo general, se agrega una regla de reescritura de Apache como la siguiente:
O, si está detrás de un equilibrador de carga, como estamos en este caso:
Sin embargo, estas configuraciones solo funcionan dentro de un
<VirtualHost>
bloque. CambiarRewriteCond
a un<If>
bloque permite que funcione correctamente fuera de un<VirtualHost>
bloque, lo que nos permite instalar 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/etc/httpd/conf.d/*.conf
, lo que coincide con la ruta del archivo donde almacenamos este archivo.La
-n '%{HTTP:X-Forwarded-Proto}'
parte de la condición evita que se 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 de prueba que es de instancia única y no tiene https. Esto no es necesario si está utilizando balanceadores de carga y https en todos sus entornos, pero no está de más tenerlo.Malas soluciones que he visto
He visto muchas malas soluciones a este problema, y vale la pena analizarlas para entender por qué es necesaria esta solución.
Use Cloudfront: algunas personas sugieren usar la configuración de Cloudfront sin caché frente a Elastic Beanstalk para realizar la redirección de HTTP a HTTPS. Esto agrega un servicio completamente nuevo (lo que agrega complejidad) que no es exactamente apropiado (Cloudfront es una 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 usa Apache, así que ese es el camino que debemos seguir.
SSH en el servidor y ...: Esto es completamente antitético hasta el punto de Elastic Beanstalk y tiene muchos problemas. Las instancias nuevas creadas mediante el ajuste de escala automático no tendrán la configuración modificada. Los entornos clonados no tendrán la configuración. Cualquier cantidad de un conjunto razonable de cambios ambientales eliminará la configuración. Esta es una mala idea.
Sobrescriba la configuración de Apache con un nuevo archivo: esto está entrando en el ámbito correcto de la solución, pero lo deja con una pesadilla de mantenimiento si Elastic Beanstalk cambia aspectos de la configuración del servidor (lo que muy bien pueden hacer). Consulte también los problemas en el siguiente elemento.
Edite dinámicamente el archivo de configuración de Apache para agregar algunas líneas: esta es una idea decente. El problema con esto es que no funcionará si Elastic Beanstalk alguna vez cambia el nombre de su archivo de configuración Apache predeterminado, y que este archivo se puede sobrescribir cuando menos lo espera: https://forums.aws.amazon.com/thread .jspa? threadID = 163369
fuente
R=301
para enviar una redirección permanente.ssl_rewrite.conf
archivo se crea (se verifica coneb ssh
) pero no se realiza ninguna redirección. : SSi aloja su sitio web en S3, algunas partes de esta respuesta pueden serle útiles.
Esto funcionó para mí:
Cargue el certificado en AWS mediante el
aws
comando de la consola. La estructura de comando es:En su aplicación Elastic Beanstalk, vaya a Configuración -> Nivel de red -> Equilibrio de carga y haga clic en el icono de engranaje .
Seleccione Puerto de escucha seguro como 443 . Seleccione Protocolo como HTTPS . Seleccione
CERTIFICATE_NAME
del paso 2 para el ID del certificado SSL . Guarde la configuración.Ve a tu consola . Haga clic en Instancias EC2 . Haga clic en Load Balancers . Haga clic en los balanceadores de carga. Haga clic en Instancias y desplácese hacia abajo para ver las instancias EC2 asignadas a ese balanceador de carga. Si la instancia EC2 tiene el mismo nombre que la URL de su aplicación (o algo parecido), tome nota del nombre DNS del balanceador de carga. Debe estar en el formato
awseb-e-...
Vuelve a tu consola . Haga clic en CloudFront . Haga clic en Crear distribución . Seleccione una distribución web .
Configure la distribución. Configure su Nombre de dominio de origen con el nombre DNS del equilibrador de carga que encontró en el paso 5 . Configure la Política de protocolo del visor para redirigir HTTP a HTTPS . Establezca Forward Query Strings en Sí . Establezca Nombres de dominio alternativos (CNAME) en las URL que desea utilizar para su aplicación. Configure el Certificado SSL en el
CERTIFICATE_NAME
que cargó en el paso 2 . Crea tu distribución.Haga clic en el nombre de su 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 Visor de coincidencias . Regresa. Haga clic en Comportamientos , seleccione su origen y haga clic en Editar . Cambie Encabezados de reenvío a Lista blanca y agregue Host . Salvar.
Nota: también escribí una guía más larga .
fuente
elasticbeanstalk.conf
archivo realmente no debería entrar en juego aquí a menos que esté anulando la configuración en la guía anterior.El más votado no funciona para mí ... la directiva <Si> solo funciona con Apache 2.4+, pero ElasticBeanstalk tiene la versión 2.2.x.
Entonces, siguiendo el mismo consejo que el anterior. Cree un archivo llamado .ebextensions / https_rewrite.config con el siguiente contenido
Esto parece funcionar para mí.
Sobre cómo compilar este archivo en su archivo WAR, vea esta respuesta
fuente
Con los nuevos Application Load Balancers, ahora puede hacer esto de manera bastante trivial ...
Asegúrese de configurar uno de estos en el momento de configurar un entorno de EB (creo que todavía está predeterminado en el equilibrador de carga clásico). No puede cambiar el tipo una vez creado el entorno, así que vuelva a crearlo
Una vez hecho esto, vaya a la configuración de EC2 -> Load Balancers. Haga clic en el equilibrador de carga que creó para su entorno de EB. Debe asegurarse de haber configurado un oyente HTTPS antes de esta tarea, así que asegúrese de escuchar HTTPS 443 con un certificado SSL y reenviar el tráfico a sus instancias con HTTP en 80.
Luego agregue un nuevo oyente que escuche en HTTP y agregue una acción predeterminada de "Redirigir a:". Asegúrese de configurar HTTPS como protocolo, 443 como puerto, "Host original, ruta, consulta" como opción y finalmente 301 como código de respuesta HTTP.
Una vez que se agrega este oyente, asegúrese de actualizar su grupo de seguridad EC2 Load Balancer para aceptar conexiones HTTPS y HTTP, verá una pequeña señal de advertencia en el oyente para recordarle.
Chris
fuente
Editar: la solución de Zags es más general y correcta. Lo recomiendo sobre el mío (que es específico de un env de 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:
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".
fuente
/etc/httpd/conf.d/https_redirect.conf
no tiene que existir, vea la respuestaEstoy tratando de redirigir un beanstalk elástico con loadbalancer en 2018. Ninguna de las respuestas anteriores funciona en mi entorno. Varios problemas que encontré:
Estaba probando la respuesta más votada, pero mi gato es la versión 2.7. No es compatible.
Estaba usando container_commands y copié la configuración 00_applications. AWS simplemente lo ignora.
Así que finalmente lo hice funcionar 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:
Y luego este es el contenido de ssl.conf
Espero que esto ayude.
fuente
nginx: [emerg] unknown directive "<VirtualHost"
en los registros de EB después de agregar esto. ¿Alguien más está viendo este comportamiento?Me funciona con el siguiente comando:
y sin la verificación https:
Parece que ELB cambió el valor de X-Fordered-Proto a http (incluso en el protocolo TCP).
fuente
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 el httpd.conf completo de su instancia y colóquelo en su código en .ebextention bajo la estructura de carpetas mencionada en el enlace anterior. Luego, simplemente agregue la siguiente línea a ese archivo en su proyecto
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
Ahora implemente su código. Debería funcionar.
fuente
En Elastic Beanstalk, simplemente puede agregar su configuración de modo 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 debajo de la ruta: .ebextensions \ httpd \ conf.d
Contenido del archivo:
'.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 carpeta no existe, simplemente créelos.
fuente
Tuve dificultades 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 la aplicación Tomcat 8, Apache2 y Spring Boot. Hay ejemplos de ebextension realmente útiles en el github de AWS Labs .
Resumen de lo que funcionó para mí:
Aquí hay un ejemplo de la aplicación Spring Boot .
fuente
Tengo las siguientes configuraciones para beanstalk elásticos (64 bits 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 solución de Zagas descrita anteriormente (que es muy compleja) no me funciona.
Esta solución tiene más sentido para mí, pero tampoco 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 los archivos "run.config" y "ssl_rewrite.conf" en el directorio ".ebextendsion".
run_config contiene
ssl_rewrite.conf contiene
ssl_rewrite.conf se crea en el directorio "conf.d" pero la redirección de http a https no funciona.
La única solución que funcionó para mí fue agregar las siguientes líneas en "/etc/httpd/conf.d/elasticbeanstalk/00_application.conf"
pero esta es una solución temporal y si se reemplaza una máquina, mi redirección https desaparece.
fuente
files:
, el contenido del archivo debajocontent: |
y configure el modo, propietario y grupo apropiados. A continuación, ELB creará el archivo automáticamente./etc/httpd/conf.d/elasticbeanstalk.conf
lugar?En caso de que alguien todavía esté luchando:
He luchado durante algún tiempo y, finalmente, encontré un GitHub (del equipo de AWS) con todas las configuraciones de AWS y el siguiente ejemplo funciona para la redirección HTTP> HTTPS para Apache 2.2. (Para las configuraciones para Apache 2.4 y Nginx, consulte el enlace a continuación).
Apache 2.2
Cree un archivo en el directorio raíz de su aplicación: YOUR_PROJECT_ROOT / .ebextensions / httpd / conf.d / elasticbeanstalk.conf (En caso de usar IntelliJ / Java, asegúrese de que se agregue al artefacto .WAR final)
Agregue las siguientes líneas para habilitar la redirección en el host virtual:
Para obtener más ejemplos de Apache 2.4 y Nginx, visite este repositorio de GitHub:
https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files/aws-provided/security-configuration/https-redirect/java-tomcat
Además, hay muchas más configuraciones útiles y ejemplos disponibles.
Saludos
fuente
Habilitación de HTTPS a través de una variable de entorno
Necesitaba hacer cumplir HTTPS solo para nuestro entorno de producción, y no para los de desarrollo y preparación que también están en Elastic Beanstalk pero no usan un balanceador de carga (y por lo tanto no se les puede asignar un certificado directamente).
Utilizo una variable de entorno
USE_HTTPS
. Copiamos elssl_rewrite.conf
archivo si y solo siUSE_HTTPS
está configurado entrue
..ebextensions / files / ssl_rewrite.conf
.ebextensions / https.config
Tenga en cuenta que si cambia
USE_HTTPS
, debe volver a implementar su aplicación para que el cambio surta efecto. También puede eliminar losecho
comandos delhttps.config
archivo si lo desea.fuente
AWS también tiene alguna documentación sobre esto.
Si está utilizando un balanceador de carga de aplicaciones, agregue el archivo
http-to-https.config
a su.ebextensions
carpeta y luego agregue la siguiente configuración ( no olvide ingresar el ARN de su certificado https ):NOTA: asegúrese de que aún no ha agregado un oyente en el puerto 443 a través de la consola EB. Si lo hizo, elimine el oyente antes de agregar el archivo .config.
La ventaja de usar su LB para esto es que su configuración será independiente del servidor que usa como nginx, apache, etc.
fuente
Encontré una respuesta de aquí para ser útil.
Todo lo que hice fue hacer la ruta de verificación
/index.php
de estado/
en lugar de en el proceso predeterminado del balanceador de carga de la aplicación.fuente
¿Por qué no simplemente pone un archivo .htaccess en la carpeta raíz? De esa manera, simplemente puede probarlo y depurarlo. Y si lo incluye en el .zip, se implementará automáticamente en todas las instancias nuevamente.
Simplemente use
.htaccess
:fuente
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 de AWS (por lo que es el método recomendado para anular su configuración de Apache para realizar 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 una aplicación web, agregar la carpeta .ebextensions dentro de una de sus aplicaciones web no funcionará. Notará que ninguna de las configuraciones que especificó se están escribiendo o creando. Si está implementando varias aplicaciones web en el entorno de Elastic Beanstalk, deberá leer este artículo de AWS Java Tomcat Implementar varios archivos WAR en Elastic Beanstalk
En general, deberá tener la siguiente estructura antes de ejecutar el comando eb para implementar los archivos WAR:
Si la carpeta .ebextentions existe dentro de cada archivo WAR, notará que se ignora por completo y no se realizarán cambios de configuración.
Espero que esto ayude a alguien más.
fuente
Lo hemos resuelto en nuestro backend manejándolo
X-Forwarded-Proto
correctamente.Esta es nuestra configuración de Grails, pero te ayudará con la idea:
fuente
Para ampliar otras dos respuestas a esta pregunta https://stackoverflow.com/a/43026082/8775205 , https://stackoverflow.com/a/42035023/8775205 . Para los usuarios de Spring Boot que implementan sus servicios en AWS con ELB y necesitan una guía paso a paso, pueden agregar un archivo ****. Conf en src / main / webapp / .ebextensions / httpd / conf.d / en su proyecto. .
****. 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.
Después de esto, recuerde agregar un "recurso" en maven-war-plugin en su pom.xml para recoger la configuración anterior.
Finalmente, confirme y envíe su código, espere a que AWS codebuild y codepipeline recoja su código de su repositorio y lo implemente en el entorno beanstalk, o simplemente empaque su proyecto en un archivo war y cárguelo en su entorno beanstalk de AWS
fuente
AWS no acepta unserscores (_) en los encabezados, mientras que podemos usar (-), así que elimine los guiones bajos de las variables del encabezado, ejemplo: - header_var_val = "algún valor" reemplácelo con headervarval = "algún valor" . Esto funciona para mi.
fuente
Si utiliza un entorno de carga equilibrada, puede seguir las instrucciones para configurar HTTPS para su entorno de AWS Elastic Beanstalk y, al final, deshabilitar el puerto HTTP.
Tenga en cuenta que actualmente el capa de uso gratuito de AWS incluye la misma cantidad de horas para un Elastic Load Balancing (ELB) que para una microinstancia EC2.
fuente
esta es una solución fácil
Edite la versión local de wsgi.conf y agregue las siguientes reglas de redireccionamiento dentro de las etiquetas <VirtualHost> </ VirtualHost>
Cambie el "/ estado" a cualquier página que esté utilizando como página de verificación de estado .
Edite su archivo <app> .conf dentro de su. directorio ebextensions para agregar un comando de contenedor para copiar esta versión de wsgi.conf sobre la versión de Amazon
Implementa el código.
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 del archivo wsgi.conf base en el futuro, es posible que su copia ya no funcione.
Autor rickchristianson
fuente
.ebextensions
en su implementación para hacer los ajustes correctamente a través de Elastic Beanstalk, por lo que no está frustrando su propósito.