Reindirizzamento di EC2 Elastic Load Balancer da HTTP a HTTPS


104

Voglio reindirizzare tutte le richieste HTTP alla richiesta https su ELB . Ho due istanze EC2. Sto usando nginx per il server. Ho provato a riscrivere i file di configurazione di nginx senza alcun successo. Mi piacerebbe un consiglio in merito.


1
Sembra che Internet non possa concordare una soluzione unica, completa e funzionante a questo problema. Spero che tu possa ottenere un aiuto qui nel mio post . Ho dovuto fare i salti mortali per arrivare a questo, finalmente.
ADTC

1
Questo ans ha l'ultima soluzione, non l'anser accettato
AsifM

Risposte:


87

Gli AWS Application Load Balancer ora supportano il reindirizzamento nativo da HTTP a HTTPS.

Per abilitarlo nella console, procedi come segue:

  1. Vai al tuo Load Balancer in EC2 e scheda "Listener"
  2. Seleziona "Visualizza / modifica regole" sul tuo listener HTTP
  3. Elimina tutte le regole tranne quella predefinita (in basso)
  4. Modifica regola predefinita: scegli "Reindirizza a" come azione, lascia tutto come predefinito e inserisci "443" come porta.

Regola listener di reindirizzamento nativo

Lo stesso può essere ottenuto utilizzando la CLI come descritto qui .

È anche possibile farlo in Cloudformation, dove è necessario impostare un oggetto Listener come questo:

  HttpListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
      - Type: redirect 
        RedirectConfig:
          Protocol: HTTPS
          StatusCode: HTTP_301
          Port: 443

Se utilizzi ancora i Classic Load Balancer, segui una delle configurazioni NGINX descritte dagli altri.


1
Molto utile sapere che è più facile ora. Ma questa sarebbe una risposta migliore con più informazioni su cosa configurare invece di un semplice collegamento.
John Rees

1
@JohnRees ha modificato la risposta di conseguenza, spero che questo aiuti
Ulli

Bello. Ti ho votato per portarti a zero. Meriti di più.
John Rees

2
@florian sembra che tu stia utilizzando un Classic Load Balancer. Passa ad Application Load Balancer per ottenere questa opzione
Ulli

come si assegna l'Application Load Balancer alla mia istanza? (poiché non c'è instancesscheda)
Florian

107

ELB imposta l' X-Forwarded-Protointestazione, puoi usarlo per rilevare se la richiesta originale era su HTTP e reindirizzare a HTTPS.

Puoi provare questo nella tua serverconfigurazione:

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

Dai un'occhiata ai documenti ELB .


3
Dove si fa questa configurazione?
ericpeters0n

2
@ ericpeters0n lo snippet nella risposta è per nginxconfig, ma il principio è applicabile a qualsiasi server web.
Dmitry Mukhin

1
se stai utilizzando beanstalk con passenger-standalone, segui questo link per istruzioni su come modificare la configurazione di nginx. qiita.com/tak_nishida/items/cf30a2d373744943b943
Yeonho

3
Assicurati di avere listener HTTP e HTTPS sul tuo bilanciamento del carico.
Gavin Palmer

1
@ Ronald, per server conf nella risposta intendo server nginx su istanze ec2 in esecuzione dietro ELB.
Dmitry Mukhin,

34

Ho avuto lo stesso problema, nella mia situazione HTTPS era gestito interamente da ELB e non conoscevo il mio dominio di origine in anticipo, quindi ho finito per fare qualcosa del tipo:

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

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

E poi ovviamente puntando l'ELB "https" alla porta 80 dell'istanza e quindi il percorso "http" alla porta 81 dell'istanza.


3
Questo è geniale.
Andy Hayden,

2
@CodyBugstein questa è la configurazione nginx, se ne hai una
timurso

@timurso se ne hai uno cosa?
CodyBugstein

@CodyBugstein se hai nginx davanti alla tua applicazione (io, ad esempio, no - è indirizzato direttamente a un container che esegue ExpressJS)
timurso

Dove andrebbe a finire il nginx? All'interno dell'ELB? Dentro l'EC2? È configurato da qualche parte in Elastic Beanstalk?
CodyBugstein

16

Amazon Elastic Load Balancer (ELB) supporta un'intestazione HTTP chiamata X-FORWARDED-PROTO. Tutte le richieste HTTPS che passano attraverso ELB avranno il valore di X-FORWARDED-PROTO uguale a "HTTPS". Per le richieste HTTP, puoi forzare HTTPS aggiungendo la seguente semplice regola di riscrittura. Per me funziona bene!

Apache

Puoi aggiungere le seguenti righe nel tuo file .htaccess:

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

Oppure, se utilizzi vhost.conf per la gestione di più domini nello stesso server Web EC2, puoi aggiungere quanto segue a vhost.conf (aggiungilo al dominio che desideri utilizzare https per esso):

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

IIS

Installa il modulo IIS Url-Rewrite, utilizzando la GUI di configurazione aggiungi queste impostazioni:

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

Leggi di più qui


Abbiamo riscontrato il problema di avere la nostra istanza reindirizzare il normale traffico http perché l'intestazione non era nemmeno presente. Lo RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
risolvo ponendo

Questo sta causando reindirizzamenti infiniti. Sto usando IIS con Windows Server.
È una trappola il

@ Itatrap: per IIS, se non ha funzionato, prova lo script in questo URL: stephen.genoprime.com/2012/01/01/aws-elb-ssl-with-iis.html
Iman Sedighi

5

Le soluzioni htaccess precedenti hanno causato il fallimento del controllo di integrità ELB. Ho avuto qualche problema a trovare la soluzione finché non ho scoperto un articolo online in cui qualcuno aveva gli stessi problemi che avevo io. La sua soluzione è stata quella di aggiungere questo all'inizio del file htaccess invece:

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

Per consentire questa e altre richieste locali su HTTP durante il reindirizzamento di richieste esterne tramite ELB a HTTPS, regola la condizione di riscrittura in modo che corrisponda su http anziché su una corrispondenza negativa su https.

Origine: reindirizzamento da HTTP a HTTPS con AWS ed ELB


"regola la condizione di riscrittura in modo che corrisponda a http invece di una corrispondenza negativa su https" questa è la parte che stavo cercando di correggere. Grazie!
Merricat


3

Ho avuto uno strano problema con la configurazione di nginx e ELB. La mia configurazione includeva 3 diversi servizi all'interno di un nginx dietro ELB. E ho avuto un problema di contenuto misto: quando la tua richiesta a ELB è https, ma solo all'interno di ELB http, e il server crea il percorso relativo a static utilizzando http, quindi il browser non riesce con il problema di "contenuto misto". E devo creare una soluzione per entrambi i lavori http / https senza reindirizzamenti.

Ecco la configurazione situata nella nginx/conf.d/cartella:

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

Ciò significa che avremo la conoscenza di cosa sia il protocollo client reale. Come puoi vedere, lo avremo in $switchvar. E in questo momento lo usi in tutte le posizioni in cui ne hai bisogno:

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

Con l'impostazione HTTPS, l'applicazione php rileverà automaticamente il protocollo corretto e costruirà con cura il percorso relativo per prevenire problemi di contenuto misto.

I migliori saluti.


3

Basato sulla risposta di @ Ulli Se vuoi configurarlo usando Terraform , ecco un esempio>

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

fonte


-2

Crea un file .ebextensions/00_forward_http_to_https.configcon il seguente contenuto:

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"

Assicurati di impostare prima la variabile d'ambiente APP_URL dalla console di gestione AWS.


Come posso farlo quando bilanci le connessioni TCP con ELB?
boom

1
Non vedo dove la tua risposta si adatti alla domanda ... stai parlando di gambo di fagiolo elastico e la domanda riguarda nginx all'interno di un EC2.
jvarandas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.