Todos os produtos
Search
Central de documentação

Object Storage Service:Incluir uma assinatura V1 no cabeçalho Authorization

Última atualização: Jul 03, 2026

Todas as operações do OSS, exceto POST e requisições assinadas por parâmetro de consulta, exigem o cabeçalho Authorization, construído com o algoritmo de assinatura V1 (HMAC-SHA1).

Importante

As assinaturas V4 são mais seguras. Incluir uma assinatura V4 no cabeçalho Authorization (recomendado).

Assinatura V1 automática com SDKs do OSS

Os SDKs do OSS gerenciam a assinatura V1 automaticamente.

SDK

Código de exemplo

Java

OSSV1Signer.java

PHP

SignerV1.php

Node.js

client.js

Browser.js

Python

auth.py

.NET

OssRequestSigner.cs

Android

OSSUtils.java

Go

v1.go

iOS

OSSModel.m

C++

SignerV1.cc

C

oss_auth.c

Ruby

util.rb

Cálculo do cabeçalho Authorization

Método de cálculo

Authorization = "OSS " + AccessKeyId + ":" + Signature
Signature = base64(hmac-sha1(AccessKeySecret,
            VERB + "\n"
            + Content-MD5 + "\n" 
            + Content-Type + "\n" 
            + Date + "\n" 
            + CanonicalizedOSSHeaders
            + CanonicalizedResource))

Parâmetros

Parâmetro

Tipo

Obrigatório

Exemplo

Descrição

AccessKeyId

String

Sim

LTAI

Par de AccessKey (AccessKey ID e AccessKey secret) para autenticação.

AccessKeySecret

String

Sim

yourAccessKeySecret

x-oss-security-token

String

Não

CAIS**

Token de segurança STS. Necessário apenas para requisições assinadas por STS. Para obter mais informações sobre como obter um token de segurança, consulte AssumeRole.

VERB

Enumeração

Sim

PUT

Método de requisição HTTP: PUT, GET, POST, HEAD, DELETE ou OPTIONS.

\n

String

Não

\n

Quebra de linha.

Content-MD5

String

Não

eB5e

Hash MD5 de 128 bits codificado em Base64 do corpo da requisição (excluindo cabeçalhos), conforme RFC 2616 Content-MD5.

Verifica a integridade da mensagem.

Para obter mais informações sobre como calcular o valor de Content-MD5, consulte Calcular Content-MD5.

Content-Type

String

Não

application/octet-stream

Tipo MIME do conteúdo da requisição.

Nota

Se você omitir Content-Type durante o cálculo da assinatura, não o inclua na requisição assinada.

Date

String

Sim

Sun, 22 Nov 2015 08:16:38 GMT

Carimbo de data/hora da requisição em UTC, proveniente do cabeçalho Date ou x-oss-date. O x-oss-date tem precedência.

Importante

Se o cabeçalho Date diferir do horário do servidor em mais de 15 minutos, o OSS rejeitará a requisição com HTTP 403.

CanonicalizedOSSHeaders

String

Não

x-oss-meta-a:a\nx-oss-meta-b:b\nx-oss-meta-c:c\n

Cabeçalhos HTTP com o prefixo x-oss-, ordenados alfabeticamente. Pode ser deixado vazio.

  • Se estiver vazio, omita o delimitador final \n.

  • Para um único cabeçalho, anexe \n ao final. Exemplo: x-oss-meta-a\n.

  • Para múltiplos cabeçalhos, anexe \n após cada cabeçalho. Exemplo: x-oss-meta-a:a\nx-oss-meta-b:b\nx-oss-meta-c:c\n.

Para obter mais informações sobre como construir CanonicalizedOSSHeaders, consulte a seção Construir CanonicalizedOSSHeaders deste tópico.

CanonicalizedResource

String

Sim

examplebucket

Recurso OSS de destino.

Para obter mais informações sobre como construir CanonicalizedResource, consulte a seção Construir CanonicalizedResource deste tópico.

Exemplos

  • Exemplo 1 (todos os parâmetros)

    Requisição

    Fórmula

    String de assinatura

    PUT /nelson HTTP/1.0 Content-MD5: eB5e Content-Type: text/html Date: Wed, 28 Dec 2022 10:27:41 GMT Host: examplebucket.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabra

    Signature = base64(hmac-sha1(AccessKeySecret,VERB + "\n" + Content-MD5 + "\n"+ Content-Type + "\n" + Date + "\n" + CanonicalizedOSSHeaders+ CanonicalizedResource))

    PUT\n eB5e\n text/html\n Wed, 28 Dec 2022 10:27:41 GMT\n x-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/examplebucket/nelson

    Calcule a assinatura com o AccessKey ID LTAI e o AccessKey secret yourAccessKeySecret:

    import hmac
    import hashlib
    import base64
    
    h = hmac.new("yourAccessKeySecret".encode('utf-8'),
                 "PUT\nODBGOERFMDMzQTczRUY3NUE3NzA5QzdFNUYzMDQxNEM\ntext/html\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/oss-example/nelson".encode('utf-8'), hashlib.sha1)
    signature =  base64.encodebytes(h.digest())
    print(signature)

    A assinatura é J9Nl3b+xdEKNQGWFhhZpjSLm****. A requisição final:

    PUT /nelson HTTP/1.0
    Authorization:OSS LTAI****************:J9Nl************************
    Content-Md5: eB5e********************
    Content-Type: text/html
    Date: Wed, 28 Dec 2022 10:27:41 GMT
    Host: oss-example.oss-cn-hangzhou.aliyuncs.com
    x-oss-meta-author: alice
    x-oss-meta-magic: abracadabra
  • Exemplo 2 (sem Content-MD5 e Content-Type)

    Requisição

    Fórmula

    String de assinatura

    PUT /nelson HTTP/1.0 Date: Wed, 28 Dec 2022 09:56:32 GMT Host: examplebucket.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabra

    Signature = base64(hmac-sha1(AccessKeySecret,VERB + "\n" + "\n"+ "\n" + Date + "\n" + CanonicalizedOSSHeaders+ CanonicalizedResource))

    PUT\n\n\nWed, 28 Dec 2022 09:56:32 GMT\n x-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/examplebucket/nelson

    Calcule a assinatura com o AccessKey ID LTAI e o AccessKey secret KZo1:

    import hmac
    import hashlib
    import base64
    
    h = hmac.new("KZo1**************************".encode('utf-8'),
                 "PUT\n\n\nWed, 28 Dec 2022 09:56:32 GMT\nx-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/oss-example/nelson".encode('utf-8'), hashlib.sha1)
    signature =  base64.encodebytes(h.digest())
    print(signature)

    A assinatura é Mhb1************************. A requisição final:

    PUT /nelson HTTP/1.0
    Authorization:OSS LTAI****************:Mhb1************************
    Date: Wed, 28 Dec 2022 09:56:32 GMT
    Host: oss-example.oss-cn-hangzhou.aliyuncs.com
    x-oss-meta-author: alice
    x-oss-meta-magic: abracadabra

Informações adicionais

  • Se o AccessKey ID não existir ou estiver inativo, o OSS retornará 403 Forbidden com InvalidAccessKeyId. Se o AccessKey ID for válido, mas a assinatura estiver incorreta, o OSS retornará 403 Forbidden com a string de assinatura esperada para depuração.

    Resposta de exemplo:

    <?xml version="1.0" ?>
    <Error>
     <Code>
         SignatureDoesNotMatch
     </Code>
     <Message>
         The request signature we calculated does not match the signature you provided. Check your key and signing method.
     </Message>
     <StringToSignBytes>
         47 45 54 0a 0a 0a 57 65 64 2c 20 31 31 20 4d 61 79 20 32 30 31 31 20 30 37 3a 35 39 3a 32 35 20 47 4d 54 0a 2f 75 73 72 65 61 6c 74 65 73 74 3f 61 63 6c
     </StringToSignBytes>
     <RequestId>
         1E446260FF9B****
     </RequestId>
     <HostId>
         oss-cn-hangzhou.aliyuncs.***
     </HostId>
     <SignatureProvided>
         y5H7yzPsA/tP4+0tH1HHvPEwUv8=
     </SignatureProvided>
     <StringToSign>
         GET
    Wed, 11 May 2011 07:59:25 GMT
    /examplebucket?acl
     </StringToSign>
     <OSSAccessKeyId>
         AKIAIVAKMSMOY7VO****
     </OSSAccessKeyId>
    </Error>
  • Se o formato do cabeçalho Authorization for inválido, o OSS retornará 400 Bad Request com InvalidArgument.

  • As datas das requisições OSS devem usar o formato UTC HTTP/1.1:

    date1 = 2DIGIT SP month SP 4DIGIT; day month year (e.g., 02 Jun 1982)
    Nota

    O campo day exige dois dígitos. Jun 2, 2 Jun 1982 e 2-Jun-1982 são inválidos.

    • Se o cabeçalho Date estiver ausente ou for inválido, o OSS retornará 403 Forbidden com AccessDenied.

    • Se o cabeçalho Date diferir do horário do servidor em mais de 15 minutos, o OSS retornará 403 Forbidden com RequestTimeTooSkewed.

Construir CanonicalizedOSSHeaders

CanonicalizedOSSHeaders inclui todos os cabeçalhos HTTP com o prefixo x-oss-:

  1. Os nomes de cabeçalho com o prefixo x-oss- devem estar em minúsculas. Exemplo: X-OSS-Meta-Name: TaoBaox-oss-meta-name: TaoBao.

  2. Para credenciais temporárias STS, adicione o token de segurança no formato x-oss-security-token:security-token.

    Nota

    Para obter mais informações sobre como configurar o STS, consulte Acessar o OSS usando credenciais temporárias STS. Você pode chamar a operação AssumeRole ou usar SDKs do STS para várias linguagens de programação para obter credenciais de acesso temporárias. As credenciais temporárias consistem em um token de segurança e um par de AccessKey temporário.

  3. Ordene todos os cabeçalhos alfabeticamente por nome.

  4. Remova espaços ao redor dos dois pontos entre cada nome e valor de cabeçalho. Exemplo: x-oss-meta-name: TaoBaox-oss-meta-name:TaoBao.

  5. Una todos os cabeçalhos com \n para produzir CanonicalizedOSSHeaders.

Construir CanonicalizedResource

CanonicalizedResource identifica o recurso OSS de destino:

  • Se o recurso contiver um bucket e um objeto, defina CanonicalizedResource como /BucketName/ObjectName.

  • Se o recurso contiver apenas um bucket, defina CanonicalizedResource como /BucketName/.

  • Se o recurso não contiver bucket nem objeto, defina CanonicalizedResource como /.

  • Se existirem sub-recursos, ordene-os alfabeticamente, separe-os com & e anexe-os após um ?. Formato: /BucketName/ObjectName?acl&uploadId=UploadId.

    O OSS suporta os seguintes tipos de sub-recursos:

    • Identificadores de recursos, como acl, uploads, location, cors, logging, website, referer, lifecycle, delete, append, tagging, objectMeta, uploadId, partNumber, security-token, position, img, style, styleName, replication, replicationProgress, replicationLocation, cname, bucketInfo, comp, qos, live, status, vod, startTime, endTime, symlink, x-oss-process, callback e callback-var. Para obter mais informações, consulte PutBucket e PutObject.

      Importante

      Os identificadores de recursos diferenciam maiúsculas de minúsculas.

    • Cabeçalhos de resposta, como response-content-language, response-expires, response-cache-control, response-content-disposition e response-content-encoding. Para obter mais informações, consulte GetObject.

    • Modos de processamento de imagem (IMG), como x-oss-process. Visão geral.

    • Campos de controle de acesso que começam com x-oss-ac-*, como x-oss-ac-source-ip, x-oss-ac-subnet-mask, x-oss-ac-vpc-id e x-oss-ac-forward-allow. Criar uma URL assinada usando a assinatura V1.

      Nota

      Após gerar uma assinatura com x-oss-ac-source-ip, remova x-oss-ac-source-ip dos parâmetros de consulta para evitar vazamentos de endereços IP.

Regras de cálculo de assinatura

  • Codifique a string de assinatura em UTF-8. Caracteres chineses exigem codificação UTF-8. Use a string codificada com AccessKeySecret para calcular a assinatura.

  • A assinatura é calculada usando HMAC-SHA1 conforme definido em RFC 2104, com o AccessKey secret como chave.

  • Content-Type e Content-MD5 são opcionais. Se omitidos, substitua por quebras de linha (\n) na string de assinatura.

  • Apenas cabeçalhos com o prefixo x-oss- são incluídos na string de assinatura. O OSS ignora outros cabeçalhos não padrão.

    Nota

    Os cabeçalhos com o prefixo x-oss- na string de assinatura devem seguir estas convenções:

    • Os nomes dos cabeçalhos devem estar em minúsculas.

    • Os cabeçalhos devem ser ordenados alfabeticamente.

    • Não deve haver espaços antes ou depois dos dois pontos que separam cada nome e valor de cabeçalho.

    • Cada cabeçalho termina com uma quebra de linha (\n). Se não houver cabeçalhos, deixe CanonicalizedOSSHeaders vazio.

Calcular Content-MD5

Estes exemplos calculam o Content-MD5 para a string "123456789".

  • Cálculo correto

    1. Calcule o hash MD5 de 128 bits da string.

    2. Codifique o resumo binário em Base64 (não a string hexadecimal de 32 caracteres).

    Exemplo em Python:

    >>> import base64,hashlib
    >>> hash = hashlib.md5()
    >>> hash.update("0123456789")   // If you use Python 3, change this line to hash.update(b"0123456789"). 
    >>> base64.b64encode(hash.digest())
    'eB5e********************'

    Chame hash.digest() para obter o resumo binário de 128 bits.

    >>> hash.digest()
    'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7'
  • Cálculo incorreto

    Nota

    Um erro comum é codificar a string hexadecimal de 32 caracteres em Base64 em vez do resumo binário.

    # Call hash.hexdigest() to obtain a 32-bit plaintext string. 
    >>> hash.hexdigest()
    '781e5e245d69b566979b86e28d23f2c7'
    # The following sample code provides an example of the result of encoding an incorrect MD5 hash in Base64: 
    >>> base64.b64encode(hash.hexdigest())
    'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='