Forneça conteúdo seguro e não seguro através do mesmo nome de anfitrião

É comum enviar conteúdo HTTP e HTTPS através do mesmo nome de anfitrião quando usa a CDN da Google Cloud. Embora muitos navegadores imponham a utilização do protocolo Transport Layer Security (TLS) e não permitam a entrega de conteúdo não seguro, ainda existem casos de utilização em que a entrega não segura e a entrega segura têm de ser permitidas através do mesmo nome de anfitrião. Este artigo aborda como pode alcançar esta funcionalidade usando o Cloud CDN.

Desafio

Quando um cliente está a estabelecer uma ligação com um servidor periférico de uma RFC, o protocolo de entrega do utilizador final é negociado. A maioria das plataformas de RFC convencionais direciona o tráfego para a respetiva área de cobertura de fornecimento da seguinte forma:

  1. Apontar para um nome de domínio pertencente à RFC, através de um registo CNAME de DNS.
  2. Encaminhar tráfego para um subconjunto de servidores que suportam a negociação de TLS para esse nome de domínio.

Uma vez que o Cloud CDN se integra com o Cloud Load Balancing, a abordagem do Cloud CDN difere da abordagem das RFCs convencionais. O Cloud CDN tira partido do endereço IP Anycast do balanceador de carga da aplicação externo. Quando configura a RFC na nuvem, tem um endereço IP específico para direcionar o tráfego. Isto requer uma construção de registo A (para IPv4) e/ou AAAA (para IPv6) no seu registo DNS, em vez de um registo CNAME com um valor de nome do anfitrião.

Por predefinição, quando configura o frontend do equilibrador de carga, este Google Cloud atribui dinamicamente um endereço IP temporário. Uma vez que tem de configurar as configurações HTTP e HTTPS separadamente, isto pode fazer com que tenha dois endereços IP para a sua instância da RFC da Google Cloud. Uma vez que o mesmo endereço IP do registo A ou AAAA é para HTTP e HTTPS, não é possível processar corretamente este caso no DNS.

Solução

Quando publica conteúdo seguro e não seguro através do mesmo nome de anfitrião, o cliente é direcionado para um servidor periférico que pode negociar HTTP ou HTTPS. Para fazer com que isto funcione com o Cloud CDN, pode reservar um endereço IP e associar o endereço IP reservado à configuração de front-end HTTP e HTTPS no Application Load Balancer externo.

HTTP e HTTPS no mesmo domínio
HTTP e HTTPS no mesmo domínio

No diagrama:

  • Os pedidos recebidos para www.example.com provêm de clientes que usam HTTP/2, HTTPS e HTTP.
  • Estão reservados dois endereços IP, um para IPv4 e outro para IPv6:

    • 34.95.111.204
    • [2600:1901:0:b13e::]
  • Estes dois endereços IP estão associados a www.example.com no Cloud DNS.

  • Ao configurar o Application Load Balancer externo, a configuração de front-end inclui quatro regras de encaminhamento que usam os endereços IP reservados:

    Nome Protocolo IP:Porta
    ipv4-http HTTP 34.95.111.204:80
    ipv4-https HTTPS 34.95.111.204:443
    ipv6-http HTTP [2600:1901:0:b13e::]:80
    ipv6-https HTTPS [2600:1901:0:b13e::]:443
  • Para falhas de cache da RFC, o balanceador de carga distribui pedidos para as origens de back-end com base nas definições definidas no mapa de URLs do balanceador de carga.

Passo 1: reserve um endereço IP externo global

Crie um endereço IPv4 ou IPv6 (ou ambos). Para suportar o endereçamento IPv4 e IPv6, tem de criar um endereço IPv4 e um endereço IPv6.

No seu registo de DNS,crie um registo A (ou AAAA) para direcionar o tráfego para este endereço IP reservado.

Consola

  1. Na Google Cloud consola, aceda à página Endereços IP externos.

    Aceda à página Endereços IP externos

  2. Clique em Reservar endereço estático para reservar um endereço IPv4.
  3. Atribua um Nome de ipv4-address.
  4. Defina o nível da rede como Premium.
  5. Defina a versão do IP como IPv4.
  6. Defina o Tipo como Global.
  7. Clique em Reservar.

O balanceador de carga usa a rede de nível Premium, conforme necessário quando o Cloud CDN está ativado.

gcloud

gcloud compute addresses create ipv4-address \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

Tome nota do endereço IPv4 que foi reservado:

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

Repita este passo para o IPv6.

Para mais informações, consulte o artigo Reserve um novo endereço IP externo estático.

Passo 2: associe o endereço IP reservado ao equilibrador de carga

Esta secção mostra como atribuir os endereços IP ao balanceador de carga. As instruções completas para configurar o balanceador de carga estão fora do âmbito deste artigo. Para ver um exemplo de configuração, consulte o artigo Criar um balanceador de carga HTTPS.

A secção de configuração do front-end permite-lhe selecionar o protocolo usado entre o cliente e o equilibrador de carga.

Neste exemplo, está a usar HTTP e HTTPS entre o cliente e o balanceador de carga, pelo que precisa de um ou mais recursos de certificado SSL para configurar o proxy.

Consola

Configurar a regra de encaminhamento HTTP

  1. Na Google Cloud consola, aceda à página Equilíbrio de carga.

    Aceda à página Balanceamento de carga

  2. Selecione o equilibrador de carga e clique em Editar.
  3. No painel esquerdo, clique em Configuração do frontend.
  4. No campo Nome, introduza ipv4-http.
  5. No campo Protocolo, selecione HTTP.
  6. Defina a versão do IP como IPv4.
  7. Em Endereço IP, selecione ipv4-address, que criou anteriormente.
  8. Certifique-se de que a Porta está definida como 80 para permitir o tráfego HTTP.
  9. Clique em Concluído.

Configurar a regra de encaminhamento HTTPS

  1. Na Google Cloud consola, aceda à página Equilíbrio de carga.

    Aceda à página Balanceamento de carga

  2. Selecione o equilibrador de carga e clique em Editar.
  3. No painel esquerdo, clique em Configuração do frontend.
  4. No campo Nome, introduza ipv4-https.
  5. No campo Protocolo, selecione HTTPS.
  6. Defina a versão do IP como IPv4.
  7. Em Endereço IP, selecione ipv4-address, que criou anteriormente.
  8. Certifique-se de que a Porta está definida como 443 para permitir o tráfego HTTP.
  9. Clique na lista pendente Certificado.
    1. Se já tiver um recurso de certificado SSL autogerido que quer usar como certificado SSL principal, selecione-o no menu pendente.
    2. Caso contrário, selecione Criar um novo certificado.
    3. Selecione Carregar o meu certificado ou Criar certificado gerido pela Google.
    4. Se selecionou Carregar o meu certificado, conclua estes passos.
      1. Preencha um Nome de www-ssl-cert.
      2. Nos campos adequados, carregue o seu certificado de chave pública (ficheiro .crt), cadeia de certificados (ficheiro .csr) e chave privada (ficheiro .key).
      3. Clique em Criar.
    5. Se escolher Criar certificado gerido pela Google, introduza um Domínio.
    6. Para adicionar recursos de certificados além do recurso de certificado SSL principal:
      1. Clique em Adicionar certificado.
      2. Selecione um certificado na lista Certificados ou clique em Criar um novo certificado e siga as instruções acima.
  10. Clique em Concluído.

Repita estes passos para o IPv6.

Reveja e finalize

  1. No painel do lado esquerdo, clique em Rever e finalizar.
  2. Compare as suas definições com o que pretendia criar.
  3. Se estiver tudo correto, clique em Atualizar.

gcloud

  1. Crie um proxy HTTP de destino para encaminhar pedidos para o seu mapa de URLs.

    gcloud compute target-http-proxies create http-lb-proxy \
      --url-map=web-map
    
  2. Crie um proxy HTTPS de destino para encaminhar pedidos para o seu mapa de URLs. O proxy é a parte do balanceador de carga que contém o certificado SSL para o balanceamento de carga HTTPS, pelo que também carrega o certificado neste passo.

    gcloud compute target-https-proxies create https-lb-proxy \
      --url-map=web-map --ssl-certificates=www-ssl-cert
    
  3. Crie duas regras de encaminhamento global para encaminhar pedidos recebidos para o proxy, uma para cada um dos endereços IP que criou.

    • Para um Application Load Balancer externo global, use o comando da CLI gcloud com load-balancing-scheme=EXTERNAL_MANAGED. Esta definição oferece capacidade de gestão avançada do tráfego.
    • Para um balanceador de carga de aplicações clássico, use load-balancing-scheme=EXTERNAL.
    gcloud compute forwarding-rules create ipv4-http \
      --load-balancing-scheme=LOAD_BALANCING_SCHEME \
      --network-tier=PREMIUM \
      --address=ipv4-address \
      --global \
      --target-http-proxy=http-lb-proxy \
      --ports=80
    
    gcloud compute forwarding-rules create ipv4-https \
      --load-balancing-scheme=LOAD_BALANCING_SCHEME \
      --network-tier=PREMIUM \
      --address=ipv4-address  \
      --global \
      --target-https-proxy=https-lb-proxy \
      --ports=443
    

Depois de criar as regras de encaminhamento global, a propagação da configuração a nível mundial pode demorar vários minutos.

Passo 3: crie um registo A ou AAAA no ficheiro de zona de DNS

O último passo do processo é criar um registo A e/ou AAAA no ficheiro de zona de DNS para apontar para a CDN da Google Cloud, onde o valor do nome do anfitrião responde com os endereços IP reservados que atribuiu no equilibrador de carga.

Agora, pode publicar HTTP e HTTPS através do mesmo nome de anfitrião através da CDN da Google Cloud.

Opcional: redirecionar HTTP para HTTPS

Se quiser redirecionar pedidos HTTP para o seu balanceador de carga HTTPS, tem de adicionar um balanceador de carga HTTP parcial que tenha um front-end, mas nenhum back-end. O front-end recebe pedidos e, em seguida, redireciona-os para o balanceador de carga HTTPS. Para tal, usa o seguinte:

Receber apoio técnico

Se tiver dúvidas acerca do Google Cloud e do Cloud CDN, contacte a sua Google Cloud equipa de vendas ou entre em contacto através do Google Cloud canal do Slack da comunidade e publique uma nota no canal #cloud-cdn.

O que se segue?