Oferecer conteúdo seguro e não seguro no mesmo nome de host

É comum exibir conteúdo HTTP e HTTPS com o mesmo nome de host ao usar o Cloud CDN. Muitos navegadores impõem o uso do Transport Layer Security (TLS) e não permitem a entrega de conteúdo não seguro, mas ainda há casos em que a entrega não segura e a entrega segura precisam ser permitidas no mesmo nome de host. Neste artigo, discutimos como conseguir essa funcionalidade usando o Cloud CDN.

Desafio

Quando um cliente estabelece uma conexão com um servidor de borda do CDN, o protocolo de entrega do usuário final é negociado. A maioria das plataformas de CDN convencionais direciona o tráfego para o respectivo alcance de entrega ao:

  1. Direcionar para um nome de domínio pertencente ao CDN, usando um registro DNS CNAME.
  2. Rotear o tráfego para um subconjunto de servidores compatíveis com a negociação TLS do nome de domínio.

Como o Cloud CDN é integrado ao Cloud Load Balancing, a abordagem do Cloud CDN é diferente da abordagem de CDNs convencionais. O Cloud CDN usa o endereço IP Anycast do balanceador de carga de aplicativo externo. Ao configurar o Cloud CDN, você tem um endereço IP específico para direcionar o tráfego. Isso exige um registro A (para IPv4) e/ou AAAA (para IPv6) no registro DNS, em vez de um registro CNAME com um valor de nome do host.

Por padrão, ao configurar o front-end do balanceador de carga, o Google Cloud atribui dinamicamente um endereço IP temporário. Como é preciso definir as configurações de HTTP e HTTPS separadamente, isso pode fazer com que você tenha dois endereços IP para sua instância do Cloud CDN. Como o mesmo endereço IP de registro A ou AAAA é usado para HTTP e HTTPS, não é possível tratar desse caso corretamente no DNS.

Solução

Ao entregar conteúdo seguro e não seguro no mesmo nome de host, o cliente é direcionado para um servidor de borda que pode negociar HTTP ou HTTPS. Para fazer isso funcionar com o Cloud CDN, reserve um endereço IP e vincule-o às configurações do front-end HTTP e HTTPS no balanceador de carga de aplicativo externo.

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

No diagrama:

  • as solicitações recebidas para www.example.com são provenientes de clientes que usam HTTP/2, HTTPS e HTTP.
  • Dois endereços IP são reservados: um para IPv4 e outro para IPv6:

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

  • Ao configurar o balanceador de carga de aplicativo externo, a configuração do 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 ausências no cache do Cloud CDN, o balanceador de carga distribui solicitações para as origens de back-end com base nas configurações definidas no mapa de URL do balanceador de carga.

Etapa 1: reserve um endereço IP externo global

Crie um endereço IPv4 ou IPv6 (ou ambos). Para dar suporte aos endereços IPv4 e IPv6, crie um endereço IPv4 e um endereço IPv6.

No registro DNS, crie um registro A (ou AAAA) para direcionar o tráfego para esse endereço IP reservado.

Console

  1. No console do Google Cloud, acesse a página Endereços IP externos.

    Acessar a 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 Versão IP como IPv4.
  6. Defina Tipo como Global.
  7. Clique em Reservar.

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

gcloud

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

Anote o endereço IPv4 que foi reservado:

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

Repita esta etapa para IPv6.

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

Etapa 2: vincule o endereço IP reservado ao balanceador de carga

Veja nesta seção como atribuir os endereços IP ao seu balanceador de carga. As instruções completas para configurar o balanceador de carga estão além do escopo deste artigo. Para ver um exemplo de configuração, consulte Como criar um balanceador de carga HTTPS.

Na seção de configuração do front-end, você seleciona o protocolo usado entre o cliente e o balanceador de carga.

Neste exemplo, você está usando HTTPS entre o cliente e o balanceador de carga. Portanto, é necessário um ou mais recursos de certificado SSL para configurar o proxy.

Console

Como configurar a regra de encaminhamento HTTP

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

    Acessar a página "Balanceamento de carga"

  2. Clique no balanceador de carga e em Editar.
  3. No painel esquerdo, clique em Configuração de front-end.
  4. No campo Nome, use ipv4-http.
  5. No campo Protocolo, selecione HTTP.
  6. Defina Versão do IP como IPv4.
  7. Em Endereço IP, selecione ipv4-address, criado anteriormente.
  8. Verifique se a Porta está definida como 80 para permitir o tráfego HTTPS.
  9. Clique em Concluído.

Como configurar a regra de encaminhamento HTTPS

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

    Acessar a página "Balanceamento de carga"

  2. Clique no balanceador de carga e em Editar.
  3. No painel esquerdo, clique em Configuração de front-end.
  4. No campo Nome, use ipv4-https.
  5. No campo Protocolo, selecione HTTPS.
  6. Defina Versão do IP como IPv4.
  7. Em Endereço IP, selecione ipv4-address, criado anteriormente.
  8. Verifique se a Porta está definida como 443 para permitir o tráfego HTTPS.
  9. Clique na lista suspensa Certificado.
    1. Se você já tiver um recurso de certificado SSL autogerenciado que você quer usar como o certificado SSL principal, selecione-o no menu suspenso.
    2. Caso contrário, selecione Criar um novo certificado.
    3. Selecione Fazer upload do meu certificado ou Criar um certificado gerenciado pelo Google.
    4. Se você selecionou Fazer upload do meu certificado, siga estas etapas.
      1. Preencha um Nome para www-ssl-cert.
      2. Nos campos adequados, carregue o Certificado de chave pública (arquivo .crt), a Cadeia de certificados (arquivo .csr) e a Chave particular (arquivo .key).
      3. Clique em Criar.
    5. Se você escolher Criar um certificado gerenciado pelo Google, informe um Domínio.
    6. Para adicionar recursos de certificado além do certificado SSL principal, siga estas etapas:
      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 essas etapas para IPv6.

Revisar e finalizar

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

gcloud

  1. Crie um proxy HTTP de destino para encaminhar solicitações ao mapa de URLs.

    gcloud compute target-http-proxies create http-lb-proxy \
      --url-map=web-map
    
  2. Crie um proxy de destino HTTPS para encaminhar solicitações ao mapa de URL. O proxy é a parte do balanceador de carga onde é armazenado o certificado SSL para balanceamento de carga HTTPS. Portanto, nesta etapa, também é possível carregar o certificado.

    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 as solicitações recebidas para o proxy, uma para cada um dos endereços IP que você criou.

    • Para um balanceador de carga de aplicativo externo global, use o comando da CLI gcloud com load-balancing-scheme=EXTERNAL_MANAGED. Essa configuração oferece recursos avançados de gerenciamento de tráfego.
    • Para um balanceador de carga de aplicativo 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 a regra de encaminhamento global, pode levar vários minutos até a configuração ser propagada em todo o mundo.

Etapa 3: crie um registro A ou AAAA no seu arquivo de zona DNS

A última etapa do processo é criar um registro A e/ou AAAA no arquivo da zona DNS para apontar para o Cloud CDN. Nele, o valor do nome do host responderá com os endereços IP reservados que você atribuiu no balanceador de carga.

Agora é possível exibir HTTP e HTTPS com o mesmo nome de host por meio do Cloud CDN.

Opcional: redirecionamento de HTTP para HTTPS

Se você quiser redirecionar solicitações HTTP para o balanceador de carga HTTPS, será necessário adicionar um balanceador de carga HTTP parcial com um front-end, mas sem back-ends. O front-end recebe solicitações e os redireciona para o balanceador de carga HTTPS. Ele faz isso da seguinte forma:

Como receber suporte

Se você tiver dúvidas sobre o Google Cloud e o Cloud CDN, entre em contato com a equipe de vendas do Google Cloud ou entre no canal da comunidade do Google Cloud no Slack e poste uma observação no canal #cloud-cdn.

A seguir