Enviar contenido HTTP y HTTPS a través del mismo dominio publicado

Es habitual enviar contenido HTTP y HTTPS a través del mismo nombre de host cuando se usa Cloud CDN. Aunque muchos navegadores aplican el uso de Seguridad en la capa de transporte (TLS) y no permiten la entrega de contenido no seguro, sigue habiendo casos en los que se debe permitir la entrega segura y no segura en el mismo nombre de host. En este artículo se explica cómo puedes conseguir esta funcionalidad con Cloud CDN.

Reto

Cuando un cliente establece una conexión con un servidor perimetral de una 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 respectiva cobertura de entrega de la siguiente forma:

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

Como Cloud CDN se integra con Cloud Load Balancing, su enfoque es diferente al de las CDNs convencionales. Cloud CDN aprovecha la dirección IP Anycast del balanceador de carga de aplicaciones externo. Al configurar Cloud CDN, tiene una dirección IP específica a la que dirigir el tráfico. Para ello, debes crear un registro A (para IPv4) o AAAA (para IPv6) en tu registro DNS, en lugar de un registro CNAME con un valor de nombre de host.

De forma predeterminada, al configurar el frontend del balanceador de carga, se asigna dinámicamente una dirección IP efímera.Google Cloud Como debe configurar las configuraciones HTTP y HTTPS por separado, puede que tenga dos direcciones IP para su instancia de Cloud CDN. Como la misma dirección IP del registro A o AAAA es para HTTP y HTTPS, no es posible gestionar este caso correctamente en el DNS.

Solución

Cuando se envía 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 que funcione con Cloud CDN, puedes reservar una dirección IP y vincularla a la configuración de frontend HTTP y HTTPS del balanceador de carga de aplicaciones externo.

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

En el diagrama:

  • Las solicitudes entrantes de www.example.com proceden de clientes que usan HTTP/2, HTTPS y HTTP.
  • Se reservan dos direcciones IP, 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.

  • Al configurar el balanceador de carga de aplicaciones 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
  • En el caso de los fallos de caché de Cloud CDN, el balanceador de carga distribuye las solicitudes a los orígenes de backend en función de los ajustes definidos en el mapa de URLs del balanceador de carga.

Paso 1: Reserva una dirección IP externa global

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

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

Consola

  1. En la Google Cloud consola, 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. Asigne un Nombre de ipv4-address.
  4. Configure el nivel de red como Premium.
  5. Configura IPv4 (versión de IP) como IPv4.
  6. En Tipo, seleccione Global.
  7. Haz clic en Reservar.

El balanceador de carga usa la red de nivel Premium, tal como se requiere cuando Cloud CDN está habilitado.

gcloud

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

Anota la dirección IPv4 que se ha reservado:

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

Repite este paso para IPv6.

Para obtener más información, consulta el artículo sobre cómo reservar una dirección IP externa estática.

Paso 2: Enlaza la dirección IP reservada con el balanceador de carga

En esta sección se muestra cómo asignar las direcciones IP a tu balanceador de carga. Las instrucciones completas para configurar el balanceador de carga no se incluyen en este artículo. Para ver un ejemplo de configuración, consulta Crear un balanceador de carga HTTPS.

La sección de configuración de frontend te permite seleccionar el protocolo que se usa entre el cliente y el balanceador de carga.

En este ejemplo, se usan tanto HTTP como HTTPS entre el cliente y el balanceador de carga, por lo que necesitas uno o varios recursos de certificado SSL para configurar el proxy.

Consola

Configurar la regla de reenvío HTTP

  1. En la Google Cloud consola, ve a la página Balanceo de carga.

    Ir a la página Balanceo de carga

  2. Selecciona el balanceador de carga y haz clic en Editar.
  3. En el panel de la izquierda, haz clic en Configuración de frontend.
  4. En el campo Name (Nombre), introduce ipv4-http.
  5. En el campo Protocol (Protocolo), selecciona HTTP.
  6. Configura Versión de IP como IPv4.
  7. En Dirección IP, selecciona ipv4-address, que has creado anteriormente.
  8. Asegúrate de que el Puerto esté configurado como 80 para permitir el tráfico HTTP.
  9. Haz clic en Listo.

Configurar la regla de reenvío HTTPS

  1. En la Google Cloud consola, ve a la página Balanceo de carga.

    Ir a la página Balanceo de carga

  2. Selecciona el balanceador de carga y haz clic en Editar.
  3. En el panel de la izquierda, haz clic en Configuración de frontend.
  4. En el campo Name (Nombre), introduce ipv4-https.
  5. En el campo Protocol (Protocolo), selecciona HTTPS.
  6. Configura Versión de IP como IPv4.
  7. En Dirección IP, selecciona ipv4-address, que has creado anteriormente.
  8. Asegúrate de que el Puerto esté configurado como 443 para permitir el tráfico HTTP.
  9. Haz clic en la lista desplegable Certificado.
    1. Si ya tienes un recurso de certificado SSL autogestionado que quieras usar como certificado SSL principal, selecciónalo en el menú desplegable.
    2. De lo contrario, selecciona Crear un certificado.
    3. Selecciona Subir mi certificado o Crear certificado gestionado por Google.
    4. Si has seleccionado Subir mi certificado, sigue estos pasos.
      1. Escribe un nombre de www-ssl-cert.
      2. En los campos correspondientes, sube tu certificado de clave pública (archivo .crt), tu cadena de certificados (archivo .csr) y tu clave privada (archivo .key).
      3. Haz clic en Crear.
    5. Si eliges Crear certificado gestionado por Google, introduce un dominio.
    6. Para añadir recursos de certificado además del recurso de certificado SSL principal, sigue estos pasos:
      1. Haz clic en Añadir certificado.
      2. Selecciona un certificado de la lista Certificados o haz clic en Crear un certificado y sigue las instrucciones que se indican más arriba.
  10. Haz clic en Listo.

Repite estos pasos para IPv6.

Revisar y finalizar

  1. En el panel de la izquierda, haz clic en Revisar y finalizar.
  2. Compara los ajustes con lo que querías crear.
  3. Si todo es correcto, haz clic en Actualizar.

gcloud

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

    gcloud compute target-http-proxies create http-lb-proxy \
      --url-map=web-map
    
  2. Crea un proxy HTTPS de destino para enrutar las solicitudes a tu mapa de URLs. El proxy es la parte del balanceador de carga que contiene el certificado SSL para el balanceo de carga HTTPS, por lo que también debes cargar tu 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 para enrutar las solicitudes entrantes al proxy, una para cada una de las direcciones IP que hayas creado.

    • En el caso de un balanceador de carga de aplicación externo global, usa el comando de gcloud CLI con load-balancing-scheme=EXTERNAL_MANAGED. Este ajuste ofrece funciones avanzadas de gestión del tráfico.
    • En el caso de un balanceador de carga de aplicación clásico, usa 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
    

Después de crear las reglas de reenvío globales, la configuración puede tardar varios minutos en propagarse por todo el mundo.

Paso 3: Crea un registro A o AAAA en tu archivo de zona DNS

El último paso del proceso consiste en crear un registro A o AAAA en el archivo de tu zona DNS para que apunte a Cloud CDN, donde el valor de tu nombre de host responderá con las direcciones IP reservadas que hayas asignado en el balanceador de carga.

Ahora puede servir contenido HTTP y HTTPS a través del mismo nombre de host mediante Cloud CDN.

Opcional: Redirigir de HTTP a HTTPS

Si quieres redirigir las solicitudes HTTP a tu balanceador de carga HTTPS, debes añadir un balanceador de carga HTTP parcial que tenga un frontend, pero no backends. El frontend recibe las solicitudes y las redirige al balanceador de carga HTTPS. Para ello, usa lo siguiente:

  • Una regla de reenvío con la misma dirección IP externa reservada que usa tu balanceador de carga HTTPS, tal como se muestra en esta página.
  • Un proxy HTTP de destino, como se muestra en esta página.
  • Un mapa de URLs que redirige el tráfico al balanceador de carga HTTPS.

Obtener asistencia

Si tienes alguna pregunta sobre Google Cloud y Cloud CDN, ponte en contacto con tu Google Cloud equipo de Ventas o a través del Google Cloudcanal de Slack de la comunidad y publica una nota en el canal #cloud-cdn.

Siguientes pasos