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í:
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/
En su aplicación Elastic Beanstalk, vaya a Configuración -> Nivel de red -> Equilibrio de carga y haga clic en el ícono de ajustes .
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.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-...
Regresa a tu consola . Haga clic en CloudFront . Haga clic en Crear distribución . Seleccione una distribución web .
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 Sí . 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ónHaga 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.
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.
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.
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.
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.
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é:
Estaba intentando la respuesta más votada, pero mi tomcat es la versión 2.7. No es compatible.
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.
Si usa un entorno Load Balanced, puede seguir las instrucciones para configurar HTTPS para su AWS Elastic Beanstalk Environment y, al final, deshabilitar el puerto HTTP.
Tenga en cuenta que actualmente el nivel de uso gratuito de AWS incluye la misma cantidad de horas para un equilibrio de carga elástico (ELB) que para una instancia de micro EC2.
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í.
- Porque la condición "Si" es desconocida
- 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í:
- Cree un archivo en /src/main/webapp/.ebextensions/httpd/conf.d/elasticbeanstalk.conf
- Agregue rescribir conds / rules teniendo cuidado de incluir "LoadModule rewrite_module modules / mod_rewrite.so"
- Implementar a AWS EBS
Aquí hay un ejemplo de la aplicación Spring Boot .
esta es una solución fácil
- ssh en su instancia de EC2
- 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
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]
Cambia el "/ estado" a la página que estés utilizando como página de control de estado .
- Guarda el archivo
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'' ...
Implementa el código.
- 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