Entrega contenido HTTP y HTTPS en el mismo dominio publicado

Es común entregar contenido HTTP y HTTPS con el mismo nombre de host cuando se usa Cloud CDN. Si bien muchos navegadores implementan el uso de la seguridad de la capa de transporte (TLS) e inhabilitan la entrega de contenido no seguro, todavía hay casos de uso en los que la entrega no segura y la segura se deben permitir en el mismo nombre de host. En este artículo, se explica cómo puedes lograr esta funcionalidad mediante Cloud CDN.

Desafío

Cuando un cliente establece una conexión con un servidor periférico de CDN, se negocia el protocolo de entrega del usuario final. La mayoría de las plataformas de CDN convencionales dirigen el tráfico a su huella de entrega respectiva de la siguiente manera:

  1. Apuntan a un nombre de dominio que pertenece a la CDN mediante un registro CNAME de DNS.
  2. Enrutan el tráfico a un subconjunto de servidores que admite la negociación TLS para ese nombre de dominio.

Debido a que Cloud CDN se integra a Cloud Load Balancing, el enfoque de Cloud CDN difiere del enfoque de las CDN convencionales. Cloud CDN aprovecha la dirección IP Anycast del balanceador de cargas de HTTP(S) externo. Cuando configuras Cloud CDN, tienes una dirección IP específica a la que dirigir el tráfico. Esto requiere una construcción de un registro A (destinado a IPv4) o AAAA (para IPv6) en el registro DNS, en lugar de un registro CNAME con un valor de nombre de host.

De forma predeterminada, cuando se configura el frontend del balanceador de cargas, Google Cloud asigna de manera dinámica una dirección IP efímera. Ya que necesitas establecer la configuración de HTTP y HTTPS por separado, esto puede provocar que tengas dos direcciones IP para la instancia de Cloud CDN. Debido a que la misma dirección IP de registro A o AAAA es para HTTP y HTTPS, no es posible controlar de forma correcta este caso en DNS.

Solución

Cuando se entrega contenido seguro y no seguro a través del mismo nombre de host, el cliente se dirige a un servidor perimetral que puede negociar HTTP o HTTPS. Para hacer este trabajo con Cloud CDN, puedes reservar una dirección IP y vincular la dirección IP reservada a la configuración del frontend de HTTP y HTTPS en el balanceador de cargas de HTTP(S) externo.

HTTP y HTTPS en el mismo dominio
HTTP y HTTPS en el mismo dominio

En el diagrama, se muestra lo siguiente:

  • Las solicitudes entrantes para www.example.com provienen de clientes que usan HTTP/2, HTTPS y HTTP.
  • Hay dos direcciones IP reservadas, una para IPv4 y otra para IPv6:

    • 34.95.111.204
    • [2600:1901:0:b13e::]
  • Estas dos direcciones IP están vinculadas a www.example.com en Cloud DNS.

  • Cuando se configura el balanceador de cargas de HTTP(S) externo, la configuración de frontend incluye cuatro reglas de reenvío que usan las direcciones IP reservadas:

    Nombre Protocolo IP:Puerto
    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 los errores de caché en Cloud CDN, el balanceador de cargas distribuye las solicitudes a los orígenes del backend, según la configuración definida en el mapa de URL del balanceador de cargas.

Paso 1: reserva una dirección IP externa global

Crea una dirección IPv4 o IPv6 (o ambas). Para admitir la dirección IPv4 e IPv6, debes crear una dirección IPv4 y una IPv6.

En el registro DNS, crea un registro A (o AAAA) para dirigir el tráfico a esta dirección IP reservada.

Console

  1. En Google Cloud Console, ve a la página Direcciones IP externas.

    Ir a la página Direcciones IP externas

  2. Haz clic en Reservar dirección estática para reservar una dirección IPv4.
  3. Asigna un Nombre de ipv4-address.
  4. Establece el nivel de red en Premium.
  5. Configura la Versión de IP como IPv4.
  6. Configura el Tipo como Global.
  7. Haz clic en Reservar.

El balanceador de cargas usa las herramientas de redes de nivel Premium, según sea necesario cuando Cloud CDN está habilitado.

gcloud

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

Toma nota de la dirección IPv4 que se reservó:

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

Repite este paso para IPv6.

Para obtener más información, consulta Reserva una dirección IP externa estática nueva.

Paso 2: vincula la dirección IP reservada al balanceador de cargas

En esta sección, se muestra cómo asignar las direcciones IP al balanceador de cargas. Las instrucciones de extremo a extremo para configurar el balanceador de cargas exceden el alcance de este artículo. Para ver una configuración de ejemplo, consulta Crea un balanceador de cargas de HTTPS.

La sección de configuración de frontend te permite seleccionar el protocolo que se usará entre el cliente y el balanceador de cargas.

En este ejemplo, se usan HTTP y HTTPS entre el cliente y el balanceador de cargas, por lo que se necesita uno o más recursos de certificado SSL para configurar el proxy.

Console

Configura la regla de reenvío de HTTP

  1. En Google Cloud Console, ve a la página Balanceo de cargas.

    Ir a la página Balanceo de cargas

  2. Selecciona el balanceador de cargas y haz clic en Editar.
  3. En el panel izquierdo, haz clic en Configuración de frontend.
  4. En el campo Nombre, ingresa ipv4-http.
  5. En el campo Protocolo, selecciona HTTP.
  6. Establece la Versión de IP como IPv4.
  7. En Dirección IP, selecciona ipv4-address, que creaste antes.
  8. Asegúrate de que el Puerto esté establecido en 80 para permitir el tráfico HTTP.
  9. Haz clic en Listo.

Configura la regla de reenvío de HTTPS

  1. En Google Cloud Console, ve a la página Balanceo de cargas.

    Ir a la página Balanceo de cargas

  2. Selecciona el balanceador de cargas y haz clic en Editar.
  3. En el panel izquierdo, haz clic en Configuración de frontend.
  4. En el campo Nombre, ingresa ipv4-https.
  5. En el campo Protocolo, selecciona HTTPS.
  6. Establece la Versión de IP como IPv4.
  7. En Dirección IP, selecciona ipv4-address, que creaste antes.
  8. Asegúrate de que el Puerto esté establecido en 443 para permitir el tráfico HTTP.
  9. Haz clic en la lista desplegable Certificado.
    1. Si ya tienes un recurso de certificado SSL autoadministrado que deseas usar como certificado SSL principal, selecciónalo en el menú desplegable.
    2. De lo contrario, selecciona Crear un nuevo certificado.
    3. Selecciona Subir mi certificado o Crear certificado que administra Google.
    4. Si seleccionaste Subir certificado, completa estos pasos.
      1. En Nombre, ingresa www-ssl-cert.
      2. En los campos correspondientes, sube el Certificado de clave pública (archivo .crt), la Cadena de certificados (archivo .csr) y la Clave privada (archivo .key).
      3. Haz clic en Crear.
    5. Si seleccionas Crear certificado administrado por Google, ingresa un Dominio.
    6. Para agregar otros recursos de certificado, además del recurso de certificado SSL principal, haz lo siguiente:
      1. Haz clic en Agregar certificado.
      2. Selecciona un certificado de la lista Certificados o haz clic en Crear un certificado nuevo y sigue las instrucciones anteriores.
  10. Haz clic en Listo.

Repite estos pasos para IPv6.

Revisión y finalización

  1. En el panel izquierdo, haz clic en Revisar y finalizar.
  2. Compara tu configuración con lo que pretendías crear.
  3. Si todo parece correcto, haz clic en Actualizar.

gcloud

  1. Crea un proxy HTTP de destino para enrutar las solicitudes a tu mapa de URL.

    gcloud compute target-https-proxies create http-lb-proxy \
      --url-map=web-map
    
  2. Crea un proxy HTTPS de destino para enrutar las solicitudes a tu mapa de URL. El proxy es la parte del balanceador de cargas que contiene el certificado SSL para el balanceo de cargas de HTTPS, por lo que también debes cargar el certificado en este paso.

    gcloud compute target-https-proxies create https-lb-proxy \
      --url-map=web-map --ssl-certificates=www-ssl-cert
    
  3. Crea dos reglas de reenvío globales a fin de enrutar las solicitudes entrantes al proxy, una para cada una de las direcciones IP que creaste.

    gcloud compute forwarding-rules create ipv4-http \
      --address=ipv4-address \
      --global \
      --target-https-proxy=http-lb-proxy \
      --ports=443
    
    gcloud compute forwarding-rules create ipv4-https \
      --address=ipv4-address  \
      --global \
      --target-https-proxy=https-lb-proxy \
      --ports=443
    

Después de crear las reglas de reenvío globales, la configuración puede tomar varios minutos en propagarse a nivel mundial.

Paso 3: crea un registro A o AAAA en el archivo de la zona DNS

El último paso del proceso es crear un registro A o AAAA en el archivo de la zona DNS para apuntar a Cloud CDN, en el que el valor de nombre de host responderá con las direcciones IP reservadas que asignaste al balanceador de cargas.

Ahora puedes entregar HTTP y HTTPS en el mismo nombre de host a través de Cloud CDN.

Redireccionamiento de HTTP a HTTPS (opcional)

Si deseas redireccionar las solicitudes HTTP al balanceador de cargas de HTTPS, debes agregar un balanceador de cargas de HTTP parcial que tenga un frontend, pero ningún backend. El frontend recibe solicitudes y, luego, las redirecciona al balanceador de cargas de HTTPS. Para ello, se usan los siguientes elementos:

Obtén asistencia

Si tienes preguntas sobre Google Cloud y Cloud CDN, comunícate con el equipo de Ventas de Google Cloud o accede al canal de la comunidad de Slack de Google Cloud y publica una nota en el canal #cloud-cdn.

Próximos pasos