Como soluciono problemas relacionados a um signed URL ou signed cookies no CloudFront?

Data da última atualização: 02/06/2022

Estou protegendo conteúdo privado usando o Amazon CloudFront e um signed URL ou signed cookies. Estou recebendo um erro 403 - Acesso negado. Como posso solucionar este erro?

Breve descrição

O Amazon CloudFront pode retornar um erro 403 - Acesso negado se houver um problema com um signed URL ou signed cookies. Consulte as seções de resolução a seguir para ver as causas desse erro e as etapas de solução de problemas.

Resolução

Ao ativar Restrict viewer access (Restringir acesso de visualizador) em um comportamento, você deve determinar um signatário. Um signatário é um grupo de chaves confiável que você cria no CloudFront ou uma conta da AWS que contém um par de chaves do CloudFront. As seguintes mensagens de erro 403 indicam que as informações do signatário estão ausentes ou incorretas:

Erro 403 - Acesso negado com a mensagem: “Missing Key-Pair-Id query parameter or cookie value” (Parâmetro de consulta ou valor de cookie Key-Pair-Id ausente).

Essa mensagem indica que o parâmetro da cadeia de caracteres de consulta Key-Pair-ID está ausente ou vazio em um signed URL.

Erro 403 - Acesso negado com a mensagem: “Missing Key-Pair-Id query parameter or cookie value” (Parâmetro de consulta ou valor de cookie Key-Pair-Id ausente).

Essa mensagem indica que o parâmetro da string de consulta CloudFront-Key-Pair-ID está ausente ou vazio no signed cookie.

Erro 403 - Acesso negado com a mensagem “Unknown key” (Chave desconhecida).

Esta mensagem indica que o CloudFront não pode verificar as informações do signatário por meio deKey-Pair-ID (para signed URLs) ou CloudFront-Key-Pair-ID (para signed cookies). Para resolver esse problema, confirme se o valor correto deKey-Pair-ID é usado para um signed URL ou CloudFront-Key-Pair-ID para signed cookies. Primeiro:

Se você estiver usando um signed URL, encontre e anote o valor deKey-Pair-ID.
-ou-
Se você estiver usando signed cookies, encontre e anote o valor deCloudFront-Key-Pair-ID.

Em seguida, encontre oID da chave e confirme se ele corresponde ao ID Key-Pair-IDou CloudFront-Key-Pair-ID:

  1. Abra o console do CloudFront. No menu de navegação esquerdo, escolha Distributions (Distribuições).
  2. Escolha a sua distribuição. Em seguida, escolha a guia Behaviors (Comportamentos).
  3. Selecione o nome do comportamento e, em seguida, escolhaEdit (Editar).
  4. Encontre a configuraçãoRestrict viewer access (Restringir acesso do visualizador).
    Observação: se estiver definido comoYes (Sim), as solicitações de arquivos que correspondam ao padrão de caminho desse comportamento de cache deverão usar o signed URL ou o signed cookie.
  5. Depois de confirmar que o campoRestrict view access (Restringir acesso à visualização) está definido comoYes (Sim), marque o campoTrusted authorization field (Tipo de autorização confiável).
  6. Se o valor da configuração doTrusted authorization type (Tipo de autorização confiável) for Trusted key groups (Grupos de chaves confiáveis), anote o nome do grupo de chaves confiável.
    Em seguida, encontre os IDs de chave pública para um grupo de chaves confiável: retorne aoconsole do CloudFront. EscolhaKey groups (Grupos de chaves). Na lista de grupos de chaves, escolha o nome do grupo de chaves confiável que você anotou.
    Confirme se o valor de Key-Pair-Id ou CloudFront-Key-Pair-ID anotado na etapa 1 corresponde a um dos IDs de chave pública no grupo de chaves confiável.
  7. Se o valor do tipo deTrusted authorization (Autorização confiável) forTrusted Signer (Signatário confiável), as credenciais do CloudFront geradas pela AWS serão usadas. Nesse caso, o valor de Key-Pair-ID ou CloudFront-Key-Pair-ID que você anotou na etapa 1 deve corresponder aoAccess Key ID (ID da chave de acesso) das credenciais do CloudFront.
    Para encontrar o ID da chave de acesso das credenciais do CloudFront, consulte Criação de pares de chaves para seus signatários.

Quando você cria um signed URL ou um signed cookie, uma declaração de política no formato JSON especifica as restrições no signed URL. Essa instrução determina por quanto tempo a URL é válida. O CloudFront retornará o erro 403 - Acesso negado se:

  • Um signed URL é enviado em um horário maior que o valor de Expires (Expira) em um signed URL usando a política predefinida.
  • Um signed cookie é enviado em um momento maior que o valor de CloudFront-Expires em um signed cookie usando uma política predefinida.
  • Um signed URL ou um signed cookie é enviado em um momento maior que o valor deDateLessThan (Data menor que) ou menor que o valor deDateGreaterThan (Data maior que) na política personalizada.

Observação: os valores em Expires (Expira), CloudFront-Expires, DateLessThan (Data menor que) e DateGreaterThan (Data maior que) estão no formato de hora Unix (em segundos) e no Tempo Universal Coordenado (UTC). Por exemplo, 1º de janeiro de 2013 10:00 h UTC é convertido para 1357034400 no formato de hora Unix. Se estiver usando o tempo epoch, use um número inteiro de 32 bits para uma data que não seja posterior a 2147483647 (19 de janeiro de 2038 às 03:14:07 h UTC).

O parâmetroPolicy (Políticas) em um signed URL ou o atributo CloudFront-Policy em um signed cookie indica que uma política personalizada é usada. A declaração de política está no formato JSON e codificada em base64. Para descobrir o valor de DateLessThan (Data menor que) ouDateGreaterThan (Data maior que), use um comando de decodificação 64base.

Um exemplo de política personalizada de codificação base64 se parece com:

eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__

Use o seguinte comando do Linux para decodificar a política personalizada no formato codificado base64 para o formato JSON. Este exemplo usa o valor do exemplo anterior. Substitua por sua própria política personalizada.

$ echo -n eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__ | base64 -di

A saída do comando é semelhante à seguinte:

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

O CloudFront retornará um erro 403 - Acesso negado se mais de uma instrução for incluída na política predefinida ou na política predefinida.

Para solucionar problemas, use o comando Linux na seção anterior para verificar a declaração da política personalizada. Verifique os detalhes do seu código e confirme se apenas uma instrução está incluída na política predefinida ou na política predefinida.

O CloudFront retornará o erro 403 - Acesso negado se:

  • A URL base na chaveResource (Recurso) na declaração de política tem uma URL abreviada (www.example.com). Use uma URL completa (http://www.example.com).
  • A URL base não tem codificação de caracteres UTF-8.
  • A URL base não inclui todos os nomes de pontuação e parâmetros.
  • O protocolo HTTP ou HTTPS na URL base não corresponde ao protocolo usado em uma solicitação que está enviando um signed URL ou signed cookies.
  • O nome de domínio no URL base não corresponde ao valor do cabeçalho do Host usado pelo atendente do usuário que está enviando um signed URL ou signed cookies.
  • A string de consulta da URL base inclui caracteres que não são válidos.

O CloudFront retornará o erro 403 - Acesso negado se:

  • A declaração de política inclui espaços em branco (incluindo tabulações e caracteres de nova linha).
  • A política predefinida ou a política personalizada não é formatada como string antes de ser criptografada. Isso pode acontecer se você criar um signed URL ou um signed cookie sem usar um SDK da AWS.
  • A política não foi criptografada antes de gerar a assinatura. Isso pode acontecer se você estiver criando um signed URL ou um signed cookie sem usar um SDK da AWS.

Para obter as práticas recomendadas de assinatura ao usar um signed URL ou signed cookies, consulte Exemplos de código para criar uma assinatura para um signed URL.

O CloudFront retornará o erro 403 - Acesso negado se:

  • Um signed URL ou signed cookies foram enviados de um endereço IP IPv6.
  • Um signed URL ou signed cookies não foram enviados de um endereço IPv4 ou intervalo de IP IPv4 especificado na política personalizada.

OIpAddress (Endereço IP) da chave só está disponível na política personalizada em um signed URL ou em um signed cookie. Endereços IP no formato IPv6 não são compatíveis. Se você estiver usando uma política personalizada que incluaIpAddress (Endereço IP), não habilite o IPv6 para distribuição.

O CloudFront retornará um erro 403 - Acesso negado se os cookies forem retornados do CloudFront, mas não tiverem sido incluídos nas seguintes solicitações para o mesmo domínio. Nesse caso, verifique os atributos de cookie Domain (Domínio) ePath (Caminho) no cabeçalho de respostaSet-Cookie.

O valorDomain (Domínio) é o nome de domínio para o arquivo solicitado. Se você não especificar um atributo Domain (Domínio), o valor padrão será o nome de domínio na URL. Isso se aplica somente ao nome de domínio especificado, não aos subdomínios. Se você especificar um atributo Domain (Domínio), ele também se aplica a subdomínios.

Se você especificar um atributo Domain (Domínio), o nome de domínio na URL e o valor do atributo Domain deverão ser correspondentes. Você pode especificar o nome de domínio que o CloudFront atribui à sua distribuição (por exemplo, d111111abcdef8.cloudfront.net), mas não é possível especificar *.cloudfront.net para o nome de domínio. Para usar um nome de domínio alternativo (como example.com) em URLs, adicione um nome de domínio alternativo à sua distribuição.

O valorPath (Caminho) é o caminho para o arquivo solicitado. Se você não especificar um atributo Path (Caminho), o valor padrão será o caminho na URL.


Este artigo ajudou?


Você necessita de suporte técnico ou relacionado à cobrança?