88 votes

Comment forcer https sur elastic beanstalk ?

Je n'arrive pas à forcer https sur le niveau d'utilisation gratuit d'elastic beanstalk.

J'ai essayé la suggestion suivante à Comment forcer https sur amazon elastic beanstalk sans échouer le contrôle de santé ?

En utilisant cette règle de réécriture 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]

Lorsque j'essaie cela, les demandes http ne sont pas redirigées vers https comme je le voudrais. Au contraire, la page http se charge normalement. J'ai également essayé d'utiliser l'en-tête X-Forwarded-Port avec le même résultat.

J'ai également essayé la règle de réécriture suivante

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

Et cette règle provoque une boucle de redirection. Il semblerait donc que les règles de réécriture d'Apache ne détectent pas les en-têtes X-Forwarded-Port et X-Forwarded-Proto d'Elastic Load Balancer, mais une boucle de redirection n'est pas non plus ce que je recherche.

Aidez-moi, s'il vous plaît. Je suis nouveau sur AWS, Elastic Beanstalk, et je ne suis pas très familier avec les règles Apache. Je ne sais pas trop où aller à partir de là. Merci.

0voto

moto kazi Points 11

Veuillez noter que la réponse la plus votée est un peu ancienne maintenant. La réponse de A Paul est en fait la bonne réponse. Le lien fourni dans sa réponse est fourni par AWS (il s'agit donc de la méthode recommandée pour remplacer votre configuration Apache afin d'effectuer la redirection de HTTP vers HTTPS lorsque vous exécutez votre application sur Elastic Beanstalk).

Il y a une chose très importante à noter. Si vous déployez plus d'une application Web, l'ajout du dossier .ebextensions dans l'une de vos applications Web ne fonctionnera pas. Vous remarquerez qu'aucune des configurations que vous avez spécifiées n'est écrite ou créée. Si vous déployez plusieurs applications Web dans l'environnement Elastic Beanstalk, vous devez lire cet article d'AWS. Java Tomcat déploie plusieurs fichiers WAR sur Elastic Beanstalk

En général, vous devez disposer de la structure suivante avant de lancer la commande eb pour déployer les fichiers WAR :

MyApplication.zip
 .ebextensions
 foo.war
 bar.war
 ROOT.war

si le dossier .ebextentions existe dans chaque fichier WAR, vous remarquerez qu'il est complètement ignoré et qu'aucun changement de configuration ne sera effectué.

J'espère que cela aidera quelqu'un d'autre.

0voto

zatziky Points 146

Nous avons résolu ce problème dans notre backend en gérant les éléments suivants X-Forwarded-Proto correctement.

Il s'agit de notre configuration Grails, mais elle vous aidera à comprendre l'idée :

    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']
    ]

0voto

Tang Mao Points 1

Pour prolonger deux autres réponses à cette question https://stackoverflow.com/a/43026082/8775205 , https://stackoverflow.com/a/42035023/8775205 . Pour les utilisateurs de Spring Boot qui déploient leurs services sur AWS avec ELB, et qui ont besoin d'un guide étape par étape, vous pouvez ajouter un fichier ****.conf sous src/main/webapp/.ebextensions/httpd/conf.d/ dans votre projet.

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

****.conf ressemble à ce qui suit. J'ai remarqué que mon site de test ne comporte qu'une seule instance, j'ai donc ajouté une condition pour l'exclure.

<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>

Après cela, n'oubliez pas d'ajouter une "ressource" sous maven-war-plugin dans votre pom.xml afin de récupérer la configuration ci-dessus.

<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>

Enfin, livrez et poussez votre code, attendez qu'AWS codebuild et codepipeline récupèrent votre code dans votre dépôt et le déploient dans l'environnement beanstalk, ou empaquetez simplement votre projet dans un fichier war et téléchargez-le dans votre environnement AWS beanstalk.

0voto

Rishabh Jhalani Points 353

AWS n'accepte pas les underscores (_) dans les en-têtes, alors que nous pouvons utiliser (-), donc supprimez les underscores des variables d'en-tête, exemple:-. header_var_val = " une valeur quelconque ". remplacez-le par headervarval = "une valeur quelconque . Cela fonctionne pour moi.

0voto

lmX2015 Points 31

Toutes les réponses ci-dessus sont dépassées en 2022, car AWS a apporté des modifications silencieuses à ElasticBeanstalk sans mettre à jour la documentation correctement.

Cependant, il est devenu très simple de le faire à partir de la console AWS lorsqu'on utilise un équilibreur de charge. Il suffit de désactiver l'écouteur sur le port 80 (http) après avoir créé l'écouteur https (environnement -> configuration -> équilibreur de charge). Et c'est tout. disable http

Plus de problème avec les contrôles de santé puisqu'ils sont effectués directement sur l'instance, et non sur l'équilibreur de charge.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X