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.