Autenticação de solicitações: uso de parâmetros de consulta (AWS Signature Version 4) - Amazon Simple Storage Service

View a markdown version of this page

Autenticação de solicitações: uso de parâmetros de consulta (AWS Signature Version 4) - Amazon Simple Storage Service

Autenticação de solicitações: uso de parâmetros de consulta (AWS Signature Version 4)

Conforme descrito na visão geral da autenticação (consulte Métodos de autenticação), você pode fornecer informações de autenticação usando parâmetros de string de consulta. Usar parâmetros de consulta para autenticar solicitações é útil quando você deseja expressar uma solicitação inteiramente em um URL. Esse método também é conhecido como pré-assinatura de um URL.

Em um cenário de caso de uso para URLs pré-assinados, você pode conceder acesso temporário aos recursos do Amazon S3. Por exemplo, você pode incorporar um URL pré-assinado em seu site ou, se preferir, usá-lo em um cliente de linha de comando (como Curl) para baixar objetos.

nota

Você também pode usar a AWS CLI para criar URLs pré-assinados. Para ter mais informações, consulte presign na Referência de comandos da AWS CLI.

O exemplo a seguir é um URL pré-assinado.

https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=<your-access-key-id>/20130721/us-east-1/s3/aws4_request &X-Amz-Date=20130721T201207Z &X-Amz-Expires=86400 &X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>

No URL de exemplo, observe:

  • Os feeds de linha são adicionados para legibilidade.

  • O valor de X-Amz-Credential no URL exibe o caractere “/” somente para facilitar a leitura. Na prática, deve ser codificado como %2F. Por exemplo:

    &X-Amz-Credential=<your-access-key-id>%2F20130721%2Fus-east-1%2Fs3%2Faws4_request

A tabela a seguir descreve os parâmetros de consulta no URL que fornecem informações de autenticação.

Nome de parâmetro de query string Valor de exemplo
X-Amz-Algorithm

Identifica a versão da assinatura da AWS e o algoritmo que você usou para calcular a assinatura.

Para o AWS Signature Version 4, você define esse valor de parâmetro como AWS4-HMAC-SHA256. Essa string identifica o AWS Signature Version 4 (AWS4) e o algoritmo HMAC-SHA256 (HMAC-SHA256).

X-Amz-Credential

Além do ID da chave de acesso, esse parâmetro também fornece o escopo (Região da AWS e serviço) para o qual a assinatura é válida. O valor deve corresponder ao escopo usado nos cálculos de assinatura, abordados na seção a seguir. A forma geral para esse valor de parâmetro é:

<your-access-key-id>/<date>/<Região da AWS>/<AWS-service>/aws4_request

Por exemplo:

AKIAIOSFODNN7EXAMPLE/20130721/us-east-1/s3/aws4_request

Para o Amazon S3, a string AWS-service é s3. Para conferir a lista de strings da AWS-region do S3, consulte Regiões e endpoints na Referência geral da AWS.

X-Amz-Date

O formato de data e hora deve seguir o padrão ISO 8601 e deve ter a formatação "aaaaMMddTHHmmssZ". Por exemplo, se a data e a hora forem “08/01/2016 15:32:41.982-700”, elas primeiro deverão ser convertidas em UTC (Tempo Universal Coordenado) e depois enviadas como “20160801T223241Z”.

X-Amz-Expires

Fornece o período, em segundos, de validade do URL pré-assinado gerado. Por exemplo, 86400 (24 horas). Esse valor é um inteiro. O valor mínimo que você pode definir é 1 e o máximo é 604800 (sete dias).

O URL pré-assinado pode ser válido por no máximo sete dias, pois a chave de assinatura usada no cálculo da assinatura é válida por até sete dias.

X-Amz-SignedHeaders

Lista os cabeçalhos usados para calcular a assinatura. Os seguintes cabeçalhos são obrigatórios para os cálculos da assinatura:

  • O cabeçalho HTTP host.

  • Todo cabeçalho x-amz-* que você pretende adicionar à solicitação.

nota

Para maior segurança, é necessário assinar todos os cabeçalhos de solicitação que pretende incluir na solicitação.

X-Amz-Signature

Fornece a assinatura para autenticar a solicitação. Essa assinatura deve corresponder à assinatura calculada pelo Amazon S3; caso contrário, o Amazon S3 negará a solicitação. Por exemplo, ., 733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7

Os cálculos de assinatura serão descritos na seção a seguir.

X-Amz-Security-Token

Parâmetro de credencial opcional ao usar credenciais provenientes do serviço STS.

Cálculo de uma assinatura

O diagrama a seguir ilustra o processo de cálculo da assinatura.

Processo de assinatura do AWS Signature Version 4 com etapas de solicitação canônica, string a ser assinada e geração de assinatura.

A tabela a seguir descreve as funções exibidas no diagrama. É necessário implementar o código para essas funções.

Função Descrição
Lowercase() Converta a string em letras minúsculas.
Hex() Codificação de base 16 em letras minúsculas.
SHA256Hash() Função de hash criptográfico do Secure Hash Algorithm (SHA).
HMAC-SHA256() Calcula o HMAC usando o algoritmo SHA256 com a chave de assinatura fornecida. Essa é a assinatura final.
Trim() Remova qualquer espaço em branco inicial e final.
UriEncode()

O URI codifica cada byte. O UriEncode() deve aplicar as seguintes regras:

  • O URI codifica cada byte, exceto os caracteres não reservados: “A”-“Z”, “a”-“z”, “0”-“9”, “-”, “.”, “_” e “~”.

  • O caractere de espaço é um caractere reservado e deve ser codificado como “%20” (e não como “+”).

  • Cada byte codificado por URI é formado por um “%” e o valor hexadecimal de dois dígitos do byte.

  • As letras no valor hexadecimal devem estar em maiúsculas; por exemplo, “%1A”.

  • Codifique o caractere de barra, “/”, em todos os lugares, exceto no nome da chave do objeto. Por exemplo, se o nome da chave do objeto for photos/Jan/sample.jpg, a barra no nome da chave não está codificada.

Importante

As funções UriEncode padrão fornecidas por sua plataforma de desenvolvimento podem não funcionar devido às diferenças na implementação e à ambiguidade relacionada nos RFCs subjacentes. É recomendável escrever sua própria função UriEncode personalizada para garantir que a codificação funcione.

Veja a seguir um exemplo da função UriEncode() em Java.

public static String UriEncode(CharSequence input, boolean encodeSlash) { StringBuilder result = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') { result.append(ch); } else if (ch == '/') { result.append(encodeSlash ? "%2F" : ch); } else { result.append(toHexUTF8(ch)); } } return result.toString(); }

Para obter mais informações sobre o processo de assinatura (detalhes da criação de uma solicitação canônica, string a ser assinada e cálculos de assinatura), consulte Cálculos de assinatura para o cabeçalho de autorização: transferência de carga útil em uma única parte (AWS Signature Version 4). O processo geralmente é o mesmo, mas a criação de CanonicalRequest em um URL pré-assinado é diferente da seguinte forma:

  • Não inclua um hash de carga útil na solicitação canônica porque, ao criar um URL pré-assinado, você não conhece o conteúdo da carga útil porque o URL é usado para carregar uma carga útil arbitrária. Em vez disso, você usa uma string constante UNSIGNED-PAYLOAD.

  • A string de consulta canônica deve incluir todos os parâmetros de consulta da tabela anterior, exceto X-Amz-Signature.

  • Para o S3, é necessário incluir o parâmetro de consulta X-Amz-Security-Token no URL ao usar credenciais provenientes do serviço STS.

  • Os cabeçalhos canônicos devem incluir o cabeçalho HTTP host. Se você pretende incluir qualquer um dos cabeçalhos x-amz-* , esses cabeçalhos também deverão ser adicionados para o cálculo da assinatura. Se desejar, adicione todos os outros cabeçalhos que pretende incluir na solicitação. Para maior segurança, você deve assinar o máximo de cabeçalhos possível. Se você adicionar um cabeçalho assinado que também seja um parâmetro de consulta assinado e o valor deles for diferente, será gerado um erro InvalidRequest, pois a entrada é conflitante.

Um exemplo

Suponha que você tenha um objeto test.txt em seu bucket examplebucket. Você deseja compartilhar esse objeto com outras pessoas por um período de 24 horas (86400 segundos) criando um URL pré-assinado.

https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>

As etapas a seguir ilustram primeiro os cálculos da assinatura e, em seguida, a construção do URL pré-assinado. O exemplo faz as seguintes suposições adicionais:

  • O carimbo de data/hora da solicitação é Fri, 24 May 2013 00:00:00 GMT.

  • O bucket está na região Leste dos EUA (Norte da Virgínia) e a credencial Scope e os cálculos de Signing Key usam us-east-1 como especificador da região. Para obter mais informações, consulte Regiões e endpoints no Referência geral da AWS.

Você pode usar esse exemplo como um caso de teste para verificar a assinatura que seu código calcula. No entanto, você deve usar o mesmo nome de bucket, chave de objeto, carimbo de data/hora e as seguintes credenciais de exemplo:

Parâmetro Valor
AWSAccessKeyId AKIAIOSFODNN7EXAMPLE
AWSSecretAccessKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  1. StringToSign
    1. CanonicalRequest

      GET /test.txt X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host host:examplebucket.s3.amazonaws.com host UNSIGNED-PAYLOAD

    2. StringToSign

      AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04

  2. SigningKey

    signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request")

  3. Signature

    aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404

    Agora você tem todas as informações para criar um URL pré-assinado. O URL resultante desse exemplo é mostrado a seguir (você pode usá-lo para comparar seu URL pré-assinado):

    https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404

Exemplo 2

Veja a seguir um exemplo (não relacionado ao exemplo anterior) mostrando um URL pré-assinado com o parâmetro X-Amz-Security-Token.

https://examplebucket.s3.us-east-1.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20200524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Security-Token=IQoJb3JpZ2luX2VjEMv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJGMEQCIBSUbVdj9YGs2g0HkHsOHFdkwOozjARSKHL987NhhOC8AiBPepRU1obMvIbGU0T%2BWphFPgK%2Fqpxaf5Snvm5M57XFkCqlAgjz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDQ3MjM4NTU0NDY2MCIM83pULBe5%2F%2BNm1GZBKvkBVslSaJVgwSef7SsoZCJlfJ56weYl3QCwEGr2F4BmCZZyFpmWEYzWnhNK1AnHMj5nkfKlKBx30XAT5PZGVrmq4Vkn9ewlXQy1Iu3QJRi9Tdod8Ef9%2FyajTaUGh76%2BF5u5a4O115jwultOQiKomVwO318CO4l8lv%2F3HhMOkpdanMXn%2B4PY8lvM8RgnzSu90jOUpGXEOAo%2F6G8OqlMim3%2BZmaQmasn4VYRvESEd7O72QGZ3%2BvDnDVnss0lSYjlv8PP7IujnvhZRnj0WoeOyMe1lL0wTG%2Fa9usH5hE52w%2FYUJccOn0OaZuyROuVsRV4Q70sbWQhUvYUt%2B0tUMKzm8vsFOp4BaNZFqobbjtb36Y92v%2Bx5kY6i0s8QE886jJtUWMP5ldMziClGx3p0mN5dzsYlM3GyiJ%2FO1mWkPQDwg3mtSpOA9oeeuAMPTA7qMqy9RNuTKBDSx9EW27wvPzBum3SJhEfxv48euadKgrIX3Z79ruQFSQOc9LUrDjR%2B4SoWAJqK%2BGX8Q3vPSjsLxhqhEMWd6U4TXcM7ku3gxMbzqfT8NDg%3D &X-Amz-Signature=<signature-value>