Rediriger EC2 Elastic Load Balancer de HTTP vers HTTPS

104

Je souhaite rediriger toute la requête HTTP vers la requête https sur ELB . J'ai deux instances EC2. J'utilise nginx pour le serveur. J'ai essayé de réécrire les fichiers nginx conf sans aucun succès. J'aimerais avoir des conseils à ce sujet.

Amit Badheka
la source
1
Il semble qu'Internet ne puisse s'entendre sur une solution unique, complète et fonctionnelle à ce problème. J'espère que vous pourrez obtenir de l'aide ici dans mon post . J'ai dû sauter à travers des cerceaux pour arriver à ça, enfin.
ADTC
1
Cet ans a la dernière solution, pas l'anser accepté
AsifM

Réponses:

87

Les AWS Application Load Balancers prennent désormais en charge la redirection native HTTP vers HTTPS.

Pour activer cela dans la console, procédez comme suit:

  1. Accédez à votre Load Balancer dans EC2 et onglet "Listeners"
  2. Sélectionnez "Afficher / modifier les règles" sur votre écouteur HTTP
  3. Supprimer toutes les règles sauf celle par défaut (en bas)
  4. Modifier la règle par défaut: choisissez "Rediriger vers" comme action, laissez tout par défaut et entrez "443" comme port.

Règle d'écoute de redirection native

La même chose peut être obtenue en utilisant la CLI comme décrit ici .

Il est également possible de le faire dans Cloudformation, où vous devez configurer un objet Listener comme celui-ci:

  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 vous utilisez toujours les Classic Load Balancers, optez pour l'une des configurations NGINX décrites par les autres.

Ulli
la source
1
Très utile pour savoir c'est plus facile maintenant. Mais ce serait une meilleure réponse avec plus d'informations sur ce qu'il faut configurer au lieu d'un simple lien.
John Rees
1
@JohnRees a modifié la réponse en conséquence, j'espère que cela vous aidera
Ulli
Agréable. Je vous ai voté pour vous amener à zéro. Tu mérites mieux.
John Rees
2
@florian vous semblez utiliser un Classic Load Balancer. Passez à l'équilibreur de charge d'application pour obtenir cette option
Ulli
comment attribuer l'équilibreur de charge d'application à mon instance? (car il n'y a pas de instancestabulation)
Florian
107

ELB définit l'en- X-Forwarded-Prototête, vous pouvez l'utiliser pour détecter si la demande d'origine était vers HTTP et rediriger vers HTTPS ensuite.

Vous pouvez essayer ceci dans votre serverconf:

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

Jetez un œil à la documentation ELB .

Dmitry Mukhin
la source
3
Où fait-on cette configuration?
ericpeters0n
2
@ ericpeters0n l'extrait de code dans la réponse est pour la nginxconfiguration, mais le principe est applicable à n'importe quel serveur Web.
Dmitry Mukhin
1
si vous utilisez beanstalk avec passager autonome, suivez ce lien pour savoir comment changer la configuration de nginx. qiita.com/tak_nishida/items/cf30a2d373744943b943
Yeonho
3
Assurez-vous d'avoir des écouteurs HTTP et HTTPS sur votre équilibreur de charge.
Gavin Palmer
1
@Ronald, par serveur conf dans la réponse, je veux dire serveur nginx sur les instances ec2 qui fonctionnent derrière ELB.
Dmitry Mukhin
34

J'ai eu le même problème, dans ma situation, HTTPS était entièrement géré par ELB et je ne connaissais pas mon domaine source à l'avance, alors j'ai fini par faire quelque chose comme:

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

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

Et puis bien sûr pointant l'ELB 'https' vers le port d'instance 80, puis la route 'http' vers le port d'instance 81.

TylerFowler
la source
3
C'est du génie.
Andy Hayden
2
@CodyBugstein c'est la configuration de nginx, si vous en avez une
timurso
@timurso si vous en avez un quoi?
CodyBugstein
@CodyBugstein si vous avez nginx devant votre application (par exemple, je ne le fais pas - il est directement acheminé vers un conteneur exécutant ExpressJS)
timurso
Où irait le nginx? À l'intérieur de l'ELB? À l'intérieur de l'EC2? Est-ce configuré quelque part dans Elastic Beanstalk?
CodyBugstein
16

Amazon Elastic Load Balancer (ELB) prend en charge un en-tête HTTP appelé X-FORWARDED-PROTO. Toutes les requêtes HTTPS passant par l'ELB auront la valeur X-FORWARDED-PROTO égale à «HTTPS». Pour les requêtes HTTP, vous pouvez forcer HTTPS en ajoutant la règle de réécriture simple suivante. Pour moi, cela fonctionne bien!

Apache

Vous pouvez ajouter les lignes suivantes dans votre fichier .htaccess:

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

Ou si vous utilisez vhost.conf pour gérer plusieurs domaines dans le même serveur Web EC2, vous pouvez ajouter ce qui suit au vhost.conf (ajoutez-le au domaine que vous souhaitez utiliser https pour cela):

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

IIS

Installez le module IIS Url-Rewrite, en utilisant l'interface graphique de configuration, ajoutez ces paramètres:

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

En savoir plus ici

Iman Sedighi
la source
Nous avons eu le problème d'avoir notre instance redirigeant le trafic http normal car l'en-tête n'était même pas présent. Je le résous en faisant la condition:RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
natronite
Cela provoque des redirections infinies. J'utilise IIS avec le serveur Windows.
C'est un piège
@ It'satrap: Pour IIS, si cela ne fonctionnait pas, essayez le script dans cette URL: stephen.genoprime.com/2012/01/01/aws-elb-ssl-with-iis.html
Iman Sedighi
5

Les solutions htaccess ci-dessus ont provoqué l'échec de la vérification de l'état ELB. J'ai eu du mal à trouver la solution jusqu'à ce que je découvre un article en ligne dans lequel quelqu'un avait les mêmes problèmes que moi. Sa solution était d'ajouter ceci au début du fichier htaccess à la place:

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

Pour autoriser cela et d'autres requêtes locales via HTTP tout en redirigeant les requêtes externes via ELB vers HTTPS, ajustez la condition de réécriture pour qu'elle corresponde sur http au lieu d'une correspondance négative sur https.

Source: redirection de HTTP vers HTTPS avec AWS et ELB

omikes
la source
"Ajustez la condition de réécriture pour correspondre sur http au lieu d'une correspondance négative sur https" c'est la partie que j'essayais de corriger. Je vous remercie!
Merricat
4

Ce n'est peut-être pas la solution que vous recherchez, mais une autre option pourrait être d'utiliser AWS CloudFront en plus d'ELB. CloudFront offre la possibilité de rediriger tout le trafic HTTP entrant vers HTTPS.

MojoJojo
la source
3

J'ai eu un problème étrange avec la configuration nginx et ELB. Ma configuration comprenait 3 services différents à l'intérieur d'un nginx derrière ELB. Et j'ai eu un problème de contenu mixte: lorsque votre demande à ELB est https, mais à l'intérieur d'ELB http uniquement, et que le serveur crée un chemin relatif vers statique en utilisant http, le navigateur échoue donc avec un problème de `` contenu mixte ''. Et je dois créer une solution pour que les deux http / https fonctionnent sans aucune redirection.

Voici la configuration située dans le nginx/conf.d/dossier:

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

Cela signifie que nous saurons ce qu'est le véritable protocole client. Comme vous pouvez le voir, nous l'aurons dans $switchvar. Et en ce moment, vous l'utilisez dans tous les endroits où vous en avez besoin:

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

Avec le paramètre HTTPS, l'application php détectera automatiquement le bon protocole et construira soigneusement le chemin relatif pour éviter les problèmes de contenu mixte.

Meilleures salutations.

Oleg Mykolaichenko
la source
3

Basé sur la réponse de @ Ulli Si vous souhaitez le configurer avec Terraform , voici un exemple>

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

La source

Mathieu Lescaudron
la source
-2

Créez un fichier .ebextensions/00_forward_http_to_https.configavec le contenu suivant:

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 's@$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"

Assurez-vous de définir au préalable la variable d'environnement APP_URL à partir de la console de gestion AWS.

Andrés
la source
Comment puis-je faire cela lors de l'équilibrage des connexions TCP avec ELB?
boom du
1
Je ne vois pas où votre réponse correspond à la question ... vous parlez de tige de haricot élastique et la question concerne le nginx à l'intérieur d'un EC2.
jvarandas