X

Como forçar o uso de HTTPs por trás AWS LoadBalancers

Quando configuramos um AWS Load Balancers vemos a opção de Listeners, onde podemos configurar qual a porta do LB que será redirecionada para a porta das instâncias que fazem parte deste.

Porém surge uma grande dúvida: Como podemos fazer o redirecionamento do acesso via HTTP para HTTPS? Lembrando que, o LB não tem esta opção de fazer o redirecionamento automático.

Portanto devemos delegar a tarefa para o serviço que responde por HTTP dentro da instância. Neste nosso caso usamos o NGinx, mas nos exemplos abaixo vamos deixar um modelo de configuração para Apache2 e IIS também.

Uma observação importante: Quando usamos o LB na frente de nossa aplicação o certificado SSL deverá ser adicionado na porta do referente ao HTTPS do próprio Load Balancers. Porém a instância deverá ter estas configurações referente a porta 443.

Pois o LB manda a requisição da porta 80 (HTTP) para o serviço na instância e lá dentro que ocorrer o redirecionamento para HTTPS.

1 – NGinx: Observer que deixamos os valores de server_name como indefinidos.

server {
  listen 80;
  server_name "";
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  g>location / {
    if ($http_x_forwarded_proto != 'https') {
      rewrite ^ https://$host$request_uri? permanent;
    }
  }
}

2 – Apache2

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

3 – IIS

Install IIS Url-Rewrite module, using the configuration GUI add these settings
<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>