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-Credentialno 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 |
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 é:
Por exemplo:
Para o Amazon S3, a string |
X-Amz-Date |
O formato de data e hora deve seguir o padrão ISO 8601 e deve ter a formatação " |
X-Amz-Expires |
Fornece o período, em segundos, de validade do URL pré-assinado gerado. Por exemplo, 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:
notaPara 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, ., 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.
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:
ImportanteAs 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.
|
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-Tokenno 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çalhosx-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 erroInvalidRequest, 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
Scopee os cálculos deSigning Keyusamus-east-1como 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 |
-
StringToSign
-
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 -
StringToSign
AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04
-
-
SigningKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request") -
Signature
aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404Agora 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>