Como configurar um redirecionamento HTTP para HTTPS

Neste exemplo, você verá como usar redirecionamentos de URL para redirecionar todas as solicitações da porta 80 (HTTP) para a porta 443 (HTTPS).

O HTTPS usa o TLS (SSL) para criptografar solicitações e respostas HTTP, tornando-o mais seguro. Um site que usa HTTPS tem https:// no início do URL em vez de http://.

Arquitetura

Para redirecionar o tráfego HTTP para HTTPS, é preciso fazer o seguinte:

  1. (Pré-requisito) Você precisa ter um balanceador de carga HTTPS externo (chamado LB1) que já esteja veiculando tráfego HTTPS na porta 443.
  2. Crie um balanceador de carga HTTP externo parcial (chamado aqui de LB2). A configuração do LB2 tem o seguinte:

    • Sem back-end
    • O mesmo endereço IP de front-end usado pelo LB1
    • Um redirecionamento configurado no mapa de URLs.

Veja essa arquitetura no diagrama a seguir.

Configuração de redirecionamento de HTTP para HTTPS (clique para ampliar)
Configuração de redirecionamento de HTTP para HTTPS

Pré-requisito: configurar um balanceador de carga HTTPS externo (LB1)

Se você ainda não tiver um balanceador de carga HTTPS externo configurado, use um dos guias a seguir para concluir essa configuração. Selecione um procedimento para seu tipo de back-end:

Se você já tem um balanceador de carga HTTPS em funcionamento, veja Como redirecionar o tráfego para seu balanceador de carga HTTPS.

Como redirecionar o tráfego para o balanceador de carga HTTPS

Depois de verificar se o balanceador de carga HTTPS (LB1) externo está funcionando, é possível criar o balanceador de carga HTTP externo (LB2) parcial com o front-end configurado para redirecionar o tráfego para LB1.

Neste exemplo, usamos o código de resposta 301. Em vez disso, é possível usar um código de resposta diferente.

Para configurar o redirecionamento com gcloud, importe um arquivo YAML e verifique se o proxy HTTP de destino aponta para o mapa de URL que redireciona o tráfego. Se você estiver usando o Console do Cloud, isso é ideal para você.

Console

Inicie a configuração

  1. No Console do Google Cloud, acesse a página Balanceamento de carga.

    Acessar o "Balanceamento de carga"

  2. Em Balanceamento de carga HTTP(S), clique em Iniciar configuração.
  3. Selecione Da Internet para minhas VMs e clique em Continuar.
  4. Em Nome do balanceador de carga, digite algo como http-redirect.
  5. Mantenha a janela aberta para continuar.

Pular a configuração de back-end

  1. Pule a seção Configuração de back-end.
    Esee balanceador de carga não precisa de um back-end.

Configurar o redirecionamento no mapa de URL

  1. Na coluna à esquerda da tela, clique em Regras de host e de caminho.
  2. Selecione Regra avançada de host e caminho (redirecionar URL, reescrever URL).
  3. Em Ação, selecione Redirecionar o cliente para um host/caminho diferente.
  4. Deixe o campo Redirecionamento de prefixo em branco.
  5. Em Redirecionamento de caminho, selecione Redirecionamento de prefixo.
  6. Deixe o campo Valor do caminho em branco.
  7. Em código de resposta de redirecionamento, selecione 301, movido permanentemente.
  8. Em Redirecionamento para HTTPS, selecione Ativar.
  9. Clique em Concluído.
  10. Mantenha a página de configuração do balanceador de carga aberta para continuar.

Configure a regra de encaminhamento de HTTP com o mesmo endereço IP usado no LB1

  1. Na página de configuração do balanceador de carga, clique em Configuração de front-end.
  2. Defina Protocolo como HTTP.
  3. O Endereço IP é o mesmo do balanceador de carga HTTPS.
  4. Verifique se Porta está definida como 80 para permitir o tráfego HTTP.
  5. Clique em Concluído.
  6. Mantenha a janela aberta para continuar.

Analise a configuração

  1. No painel esquerdo, clique em Revisar e finalizar.
  2. Compare as configurações com o que você pretendia criar.
  3. Se estiver tudo certo, clique em Criar.

gcloud

  1. Crie um arquivo YAML /tmp/web-map-http.yaml. Este exemplo usa MOVED_PERMANENTLY_DEFAULT como código de resposta.

    kind: compute#urlMap
    name: web-map-http
    defaultUrlRedirect:
      redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
      httpsRedirect: True
    tests:
    - description: Test with no query parameters
      host: foobar
      path: /test/
      expectedOutputUrl: https://foobar/test/
      expectedRedirectResponseCode: 301
    - description: Test with query parameters
      host: foobar
      path: /test/?parameter1=value1&parameter2=value2
      expectedOutputUrl: https://foobar/test/?parameter1=value1&parameter2=value2
      expectedRedirectResponseCode: 301
    
  2. Valide o mapa de URL.

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    Se os testes forem aprovados e o comando resultar em uma mensagem de êxito, salve as alterações no mapa de URL.

  3. Crie o mapa de URL do balanceador de carga HTTP importando o arquivo YAML. O nome desse mapa de URL é web-map-http.

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

    Se você estiver atualizando um mapa de URL existente, o seguinte prompt será exibido:

    Url Map [web-map-http] will be overwritten.
    
    Do you want to continue (Y/n)?
    

    Para continuar, pressione Y.

  4. Verifique se o mapa de URLs está atualizado. O mapa de URLs do balanceador de carga HTTP deve ter esta aparência:

    gcloud compute url-maps describe web-map-http
    
    creationTimestamp: '2020-03-23T10:53:44.976-07:00'
    defaultUrlRedirect:
     httpsRedirect: true
     redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
    fingerprint: 3A5N_RLrED8=
    id: '2020316695093397831'
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    
  5. Crie um novo proxy HTTP de destino ou atualize um proxy HTTP de destino existente, usando web-map-http como o mapa de URL.

    gcloud compute target-http-proxies create http-lb-proxy \
       --url-map=web-map-http \
       --global
    

    OU

    gcloud compute target-http-proxies update http-lb-proxy \
       --url-map=web-map-http \
       --global
    
  6. Crie uma regra de encaminhamento global para encaminhar as solicitações recebidas para o proxy. A sinalização --address especifica lb-ipv4-1, que é o mesmo endereço IP usado para o balanceador de carga HTTPS externo.

    gcloud compute forwarding-rules create http-content-rule \
       --address=lb-ipv4-1 \
       --global \
       --target-http-proxy=http-lb-proxy \
       --ports=80
    

Quando você terminar, o Console do Cloud exibirá dois balanceadores de carga, conforme mostrado a seguir.

Ambos os balanceadores de carga

O Console do Cloud exibe informações sobre o balanceador de carga web-map-http da seguinte maneira.

Balanceador de carga HTTP

Como adicionar um cabeçalho personalizado

É possível adicionar o cabeçalho HTTP Strict-Transport-Security ao serviço de back-end do balanceador de carga HTTPS da seguinte maneira:

  • Nome do cabeçalho: Strict-Transport-Security
  • Valor do cabeçalho: max-age=31536000; includeSubDomains; preload

Essa configuração envia o cabeçalho personalizado ao cliente. Assim, na próxima vez que ele tentar acessar o URL usando o HTTP, o navegador fará o redirecionamento.

Para adicionar o cabeçalho personalizado à configuração do serviço de back-end, use a sinalização --custom-response-header, conforme mostrado aqui:

gcloud compute backend-services update BACKEND_SERVICE_NAME_LB1 \
    --global \
    --custom-response-header='Strict-Transport-Security:max-age=31536000; includeSubDomains; preload'

Para mais informações, consulte Como criar cabeçalhos personalizados.

Como testar o redirecionamento de HTTP para HTTPS

Anote o endereço IP reservado que você está usando nos dois balanceadores de carga.

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

Neste exemplo, suponha que o endereço IP reservado é 34.98.77.106. O URL http://34.98.77.106/ redireciona para https://34.98.77.106/.

Depois de alguns minutos, teste isso executando o comando curl a seguir.

curl -v http://hostname.com

Exemplo de saída:

* Connected to 34.98.77.106 (34.98.77.106) port 80 (#0)
> GET / HTTP/1.1
> Host: hostname.com
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Referrer-Policy: no-referrer
< Location: https://hostname.com
< Content-Length: 220
< Date: Fri, 30 Jul 2021 21:32:25 GMT
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://hostname.com">here</A>.
</BODY></HTML>
* Connection #0 to host hostname.com left intact