Configura un redireccionamiento de HTTP a HTTPS

En este ejemplo, se muestra cómo usar redireccionamientos de URL para redireccionar todas las solicitudes del puerto 80 (HTTP) al puerto 443 (HTTPS).

HTTPS usa TLS (SSL) para encriptar solicitudes y respuestas HTTP, lo que lo hace más seguro y protegido. Un sitio web que usa HTTPS tiene https:// al comienzo de su URL en lugar de http://.

Arquitectura

Para redireccionar el tráfico HTTP a HTTPS, debes hacer lo siguiente:

  1. (Requisito previo) Debes tener un balanceador de cargas de HTTPS externo (llamado LB1 aquí) que ya entrega tráfico HTTPS en el puerto 443.
  2. Crea un balanceador de cargas de HTTP externo parcial (llamado LB2 aquí). La configuración de LB2 tiene lo siguiente:

    • Sin backend
    • La misma dirección IP de frontend que usa LB1
    • Un redireccionamiento configurado en el mapa de URL

Esta arquitectura se muestra en el siguiente diagrama.

Configuración de redireccionamiento de HTTP a HTTPS (haz clic para ampliar)
Configuración del redireccionamiento de HTTP a HTTPS

Requisito previo: Configura un balanceador de cargas de HTTPS externo (LB1)

Si aún no tienes configurado un balanceador de cargas de HTTPS externo, usa una de las siguientes guías para completar esa configuración. Selecciona un procedimiento para tu tipo de backend:

Si ya tienes un balanceador de cargas de HTTPS activo, ve directamente a Redirecciona el tráfico a tu balanceador de cargas de HTTPS.

Redirecciona el tráfico al balanceador de cargas de HTTPS

Después de verificar que el balanceador de cargas de HTTPS externo (LB1) funciona, puedes crear el balanceador de cargas de HTTP externo (LB2) parcial con su frontend configurado para redireccionar el tráfico a LB1.

En este ejemplo, se usa el código de respuesta 301. En cambio, puedes usar un código de respuesta diferente.

Para configurar el redireccionamiento con gcloud, debes importar un archivo YAML y asegurarte de que tu proxy HTTP de destino apunte al mapa de URL que redirecciona el tráfico. Si usas Cloud Console, tú lo controlas.

Console

Inicie la configuración

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

    Ir a Balanceo de cargas

  2. En Balanceo de cargas HTTP(S), haz clic en Iniciar configuración.
  3. Selecciona De Internet a mis VM y haz clic en Continuar.
  4. Para el Nombre del balanceador de cargas, ingresa algo como http-redirect.
  5. Mantén la ventana abierta para continuar.

Omite la configuración de backend

  1. Omite la sección Configuración de backend.
    Este balanceador de cargas no necesita un backend.

Configura el redireccionamiento en el mapa de URL

  1. En la columna izquierda de la pantalla, haz clic en Reglas de host y ruta de acceso.
  2. Selecciona Regla avanzada de host y ruta de acceso (redireccionamiento y reescritura de URL).
  3. En Acción, selecciona Redireccionar al cliente a otro host/ruta de acceso.
  4. Deja en blanco el campo Redireccionamiento de prefijo.
  5. En Redireccionamiento de ruta de acceso, selecciona Redireccionamiento de prefijo.
  6. Deja el campo Valor de la ruta de acceso en blanco.
  7. En Código de respuesta de redireccionamiento, selecciona 301 (Movido de forma permanente).
  8. En Redireccionamiento a HTTPS, selecciona Habilitar.
  9. Haz clic en Listo.
  10. Mantén abierta la página de configuración del balanceador de cargas para continuar.

Configura la regla de reenvío de HTTP con la misma dirección IP utilizada en el LB1

  1. En la página de configuración del balanceador de cargas, haz clic en Configuración de frontend.
  2. Configura Protocolo como HTTP.
  3. Configura la Dirección IP como la misma dirección IP que usaste para el balanceador de cargas de HTTPS.
  4. Asegúrate de que el valor de Puerto esté establecido en 80 para permitir el tráfico HTTP.
  5. Haz clic en Listo.
  6. Mantén la ventana abierta para continuar.

Revisa la configuració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 Crear.

gcloud

  1. Crea un archivo YAML /tmp/web-map-http.yaml. En este ejemplo, se usa MOVED_PERMANENTLY_DEFAULT como código de respuesta.

    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. Valida el mapa de URL.

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

    Si las pruebas pasan y el comando genera un mensaje de éxito, guarda los cambios en el mapa de URL.

  3. Crea el mapa de URL del balanceador de cargas de HTTP mediante la importación del archivo YAML. El nombre de este mapa de URL es web-map-http.

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

    Si actualizas un mapa de URL existente, aparecerá el siguiente mensaje:

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

    Para continuar, presiona Y.

  4. Verifica que el mapa de URL esté actualizado. El mapa de URL de tu balanceador de cargas de HTTP debería ser similar al siguiente:

    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. Crea un proxy HTTP de destino nuevo o actualiza uno existente con web-map-http como el mapa de URL.

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

    O

    gcloud compute target-http-proxies update http-lb-proxy \
       --url-map=web-map-http \
       --global
    
  6. Crea una regla de reenvío global para enrutar las solicitudes entrantes al proxy. La marca --address especifica lb-ipv4-1, que es la misma dirección IP que se usa para el balanceador de cargas de HTTPS externo.

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

Cuando termines, Cloud Console mostrará dos balanceadores de cargas de la siguiente manera.

Ambos balanceadores de cargas

Cloud Console muestra información sobre tu balanceador de cargas web-map-http de la siguiente manera.

Balanceador de cargas de HTTP

Agrega un encabezado personalizado

De forma opcional, agrega el encabezado HTTP Strict-Transport-Security al servicio de backend de tu balanceador de cargas de HTTPS, de la siguiente manera:

  • Nombre del encabezadoStrict-Transport-Security
  • Valor del encabezadomax-age=31536000; includeSubDomains; preload

Esta configuración envía el encabezado personalizado al cliente para que la próxima vez que el cliente intente acceder a la URL a través de HTTP, el navegador realice el redireccionamiento.

Para agregar el encabezado personalizado a la configuración del servicio de backend, usa la marca --custom-response-header, como se muestra aquí:

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

Para obtener más información, consulta Crea encabezados personalizados.

Prueba el redireccionamiento de HTTP a HTTPS

Ten en cuenta la dirección IP reservada que usas para ambos balanceadores de cargas.

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

En este ejemplo, supongamos que la dirección IP reservada es 34.98.77.106. La URL http://34.98.77.106/ se redirecciona a https://34.98.77.106/.

Después de unos minutos, puedes ejecutar el siguiente comando curl para probarla.

curl -v http://hostname.com

Resultado de muestra:

* 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