¿Cómo soluciono los problemas relacionados con URL o cookies firmadas en CloudFront?

Última actualización: 02-06-2022

Estoy protegiendo el contenido privado mediante Amazon CloudFront y una URL o cookies firmadas. Recibo un error 403 Access Denied (Acceso denegado). ¿Cómo puedo solucionar este error?

Descripción corta

Amazon CloudFront puede devolver un error 403 Access Denied (Acceso denegado) si hay un problema con una URL firmada o con cookies firmadas. Consulte las siguientes secciones de resolución para conocer las causas de este error y los pasos de resolución de problemas.

Resolución

Cuando activa Restrict Viewer Access (Limitar el acceso del lector) en un comportamiento, debe determinar un firmante. Un firmante es un grupo de claves de confianza que crea en CloudFront o una cuenta de AWS que contiene un par de claves de CloudFront. Los siguientes mensajes de error 403 indican que falta la información del firmante o que esta es incorrecta:

Error 403: Access Denied (Acceso denegado) con el mensaje “Missing Key-Pair-Id query parameter or cookie value” (Falta el parámetro de consulta Key-Pair-Id o el valor de la cookie).

Este mensaje indica que falta el parámetro de cadena de consulta key-pair-id o que está vacío en una URL firmada.

Error 403: Access Denied (Acceso denegado) con el mensaje “Missing Key-Pair-Id query parameter or cookie value” (Falta el parámetro de consulta Key-Pair-Id o el valor de la cookie).

Este mensaje indica que falta el parámetro de cadena de consulta CloudFront-Key-Pair-ID o que está vacío en una cookie firmada.

Error 403 Access Denied (Acceso denegado) con el mensaje “Unknown Key” (Clave desconocida).

Este mensaje indica que CloudFront no puede verificar la información del firmante mediante Key-Pair-ID (para URL firmadas) o CloudFront Key-Pair-ID (para cookies firmadas).Para resolver este problema, confirme que el valor de Key-Pair-ID correcto se utiliza para una URL firmada o CloudFront-Key-Pair-ID para las cookies firmadas. Primero:

Si utiliza una URL firmada, busque y anote el valor de Key-Pair-ID.
De forma alternativa, realice lo siguiente:
Si utiliza cookies firmadas, busque y anote el valor de CloudFront-Key-Pair-ID.

A continuación, busque el ID de clave y confirme que coincide con Key-Pair-ID o CloudFront-Key-Pair-ID:

  1. Abra la consola de CloudFront. En el panel de navegación izquierdo, elija Distributions (Distribuciones).
  2. Elija su distribución. A continuación, elija la pestaña Behaviors (Comportamientos).
  3. Seleccione el nombre del comportamiento y, a continuación, elija Edit (Editar).
  4. Busque la configuración Restrict viewer access (Restringir el acceso del lector).
    Nota: Si se establece en Yes (Sí), las solicitudes de archivos que coincidan con el patrón de ruta de este comportamiento de caché deben usar la URL o la cookie firmada.
  5. Después de confirmar que el campo Restrict viewer access (Restringir el acceso del lector) está establecido en Yes (Sí), compruebe el campo Trusted authorization type (Tipo de autorización de confianza).
  6. Si el valor de la configuración Trusted authorization type (Tipo de autorización de confianza) es Trusted key groups (Grupo de claves de confianza), anote el nombre del grupo de claves de confianza.
    A continuación, busque los ID de clave pública de un grupo de claves de confianza: vuelva a la consola de CloudFront. Elija Key Groups (Grupos clave). En la lista de grupos de claves, elija el nombre del grupo de claves de confianza que anotó.
    Confirme que el valor de Key-Pair-Id o CloudFront Key-Pair-Id que anotó en el paso 1 coincide con uno de los ID de clave pública del grupo de claves de confianza.
  7. Si el valor del tipo de Trusted authorization (Autorización de confianza) es Trusted Signer (Firmante de confianza), se utilizan las credenciales de CloudFront generadas por AWS. En este caso, el valor de Key-Pair-Id o CloudFront Key-Pair-Id que anotó en el paso 1 debe coincidir con el ID de clave de acceso de las credenciales de CloudFront.
    Para encontrar el ID de clave de acceso de las credenciales de CloudFront, consulte Creación de pares de claves para los firmantes.

Al crear una URL o cookie firmada, una declaración de política en formato JSON especifica las restricciones de la URL firmada. Esta declaración determina durante cuánto tiempo es válida la URL. CloudFront devolverá el error 403 Access Denied (Acceso denegado) si:

  • Una URL firmada se envía en un momento superior al valor de Expires (Vencimiento) en una URL firmada mediante una política predefinida.
  • Una cookie firmada se envía en un momento superior al valor de CloudFront expires (Vencimiento de CloudFront) en una cookie firmada mediante una política predefinida.
  • Se envía una URL o cookie firmada en un momento superior al valor de DateLessThan (Fecha inferior a) o inferior al valor de DateGreaterThan (Fecha superior a) en la política personalizada.

Nota: Los valores de Expires (Vencimiento), CloudFront-Expires (Vencimiento de CloudFront), DateLessThan (Fecha inferior a) y DateGreaterThan (Fecha superior a) están en formato de hora Unix (en segundos) y hora universal coordinada (UTC). Por ejemplo, el 1 de enero de 2013 a las 10.00 h UTC se convierte en 1357034400 en formato de hora Unix. Si usa una hora en formato Epoch, utilice un valor entero de 32 bits para una fecha que no sea posterior a 2147483647 (19 de enero de 2038 a las 03.14.07 h UTC).

El parámetro Policy (Política) de una URL firmada o el atributo CloudFront-Policy (CloudFront-Política) de una cookie firmada indican que se utiliza una política personalizada. La declaración de política está en formato JSON y codificada con Base64. Para averiguar el valor de DatelessThan (Fecha inferior a) o DateGreaterThan (Fecha superior a), utilice un comando de cifrado con Base64.

Un ejemplo de política personalizada de codificación con Base64 tiene el siguiente aspecto:

eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__

Utilice el siguiente comando de Linux para decodificar la política personalizada codificada con Base64 en formato JSON. En este ejemplo se utiliza el valor del ejemplo anterior. Sustitúyala por su propia política personalizada.

$ echo -n eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__ | base64 -di

El resultado del comando tiene un aspecto similar al siguiente:

{ "Statement": [{ "Resource": "http://d111111abcdef8.cloudfront.net/game_download.zip", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.0/24" }, "DateLessThan": { "AWS:EpochTime": 1426500000 } } }] }

CloudFront devolverá un error 403 Access Denied (Acceso denegado) si se incluye más de una declaración en la política predefinida o en la política personalizada.

Para solucionar problemas, utilice el comando de Linux de la sección anterior para comprobar la declaración de la política personalizada. Verifique los detalles de su código y confirme que solo se incluye una declaración en la política fija o en la política predefinida.

CloudFront devolverá un error 403 Access Denied (Acceso denegado) si:

  • La URL base del recurso clave de la declaración de política tiene una URL abreviada (www.example.com) (www.ejemplo.com). Use una URL completa (http://www.example.com) (http://www.ejemplo.com).
  • La URL base no tiene codificación de caracteres UTF-8.
  • La URL base no incluye todos los nombres de puntuación y parámetros.
  • El protocolo HTTP o HTTPS de la URL base no coincide con el protocolo que se usa en una solicitud que envía una URL firmada o cookies firmadas.
  • El nombre de dominio de la URL base no coincide con el valor del encabezado Host utilizado por el agente de usuario que envía una URL o cookies firmadas.
  • La cadena de consulta de la URL base incluye caracteres que no son válidos.

CloudFront devolverá un error 403 Access Denied (Acceso denegado) si:

  • La declaración de política incluye espacios en blanco (incluidas tabulaciones y caracteres de nueva línea).
  • La política predefinida o la política personalizada no tenían el formato de cadena antes de que se cifrase con hash. Esto puede suceder si crea una URL o cookie firmada sin usar un SDK de AWS.
  • La política no estaba cifrada antes de generar la firma. Esto puede suceder si crea una URL o cookie firmada sin usar un SDK de AWS.

Para conocer las prácticas recomendadas de firma al usar una URL o cookies firmadas, consulte Ejemplos de código para la creación de una firma para una URL firmada.

CloudFront devolverá un error 403 Access Denied (Acceso denegado) si:

  • Se envió una URL o cookies firmadas desde una dirección IP IPv6.
  • No se envió una URL o cookies firmadas desde una dirección IPv4 o un rango de IP IPv4 especificado en la política personalizada.

La dirección IP clave solo está disponible en la política personalizada en una URL o cookie firmada. No se admiten las direcciones IP en formato IPv6. Si usa una política personalizada que incluye la dirección IP, no habilite IPv6 para la distribución.

CloudFront devuelve un error 403 Access Denied (Acceso denegado) si las cookies se devuelven desde CloudFront pero no se han incluido en las siguientes solicitudes al mismo dominio. En este caso, compruebe los atributos de la cookie Domain (Dominio) y Path (Ruta) en el encabezado de respuesta Set-Cookie (Establecer-Cookie).

El valor Domain (Dominio) es el nombre de dominio del archivo solicitado. Si no especifica un atributo Domain, el valor predeterminado es el nombre de dominio en la URL. Esto solo se aplica al nombre de dominio especificado, no a los subdominios. Si especifica un atributo Domain (Dominio), también se aplica a los subdominios.

Si especifica un atributo Domain (Dominio), el nombre de dominio de la URL y el valor del atributo Domain (Dominio) deben coincidir. Puede especificar el nombre de dominio que CloudFront asigna a su distribución (por ejemplo, d111111abcdef8.cloudfront.net), pero no puede especificar *.cloudfront.net como nombre de dominio. Para usar un nombre de dominio alternativo (como ejemplo.com) en las URL, agregue un nombre de dominio alternativo a su distribución.

El valor Path (Ruta) es la ruta del archivo solicitado. Si no especifica un atributo Path (Ruta), el valor predeterminado es la ruta de acceso de la URL.


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?