Todos os produtos
Search
Central de documentação

Object Storage Service:(Recommended) V4 signatures in presigned URLs

Última atualização: Sep 24, 2026

Além de usar o cabeçalho HTTP Authorization para fornecer informações de autenticação, você pode gerar uma URL pré-assinada que inclui uma assinatura e outras informações de solicitação necessárias. Isso permite conceder acesso temporário aos seus recursos do Object Storage Service (OSS) a terceiros sem expor suas credenciais de acesso. Este tópico descreve como usar o algoritmo de assinatura V4 para criar uma URL pré-assinada.

Use os OSS SDKs para implementar automaticamente as assinaturas V4

Os OSS SDKs suportam a implementação automática de assinaturas V4. Recomendamos o uso dos OSS SDKs para iniciar solicitações, eliminando a necessidade de calcular assinaturas manualmente. Para mais informações sobre a implementação de assinaturas em uma linguagem de programação específica, consulte o código de exemplo do OSS SDK para essa linguagem. A tabela a seguir apresenta referências ao código de exemplo usado para assinar solicitações com o algoritmo de assinatura V4 nos OSS SDKs para diferentes linguagens de programação.

SDK

Example

Sample code

Java

Configure a client

OSSV4Signer.java

PHP

Configure a client

SignerV4.php

Node.js

Initialize OSS SDK for Node.js

signatureUrlV4.js

Browser.js

Initialization (Browser.js SDK)

Python

Initialization

auth.py

Go

Configure an OSSClient instance

v4.go

Objective-C

Initialization (iOS SDK)

OSSV4Signer.m

C++

Initialization (C++ SDK)

SignerV4.cc

C

Initialization (C SDK)

oss_auth.c

Assinatura de URL

  • Exemplo

    https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject?x-oss-additional-headers=host&x-oss-credential=LTAI********************%2F20241203%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-date=20241203T034420Z&x-oss-expires=86400&x-oss-signature=70c542eaf652ac291c0c343d63ac24ede41c0526661d9d4c63c0906a2686160c&x-oss-signature-version=OSS4-HMAC-SHA256

    Para facilitar a leitura, os campos do parâmetro x-oss-credential na URL acima são separados por barras (/). Ao iniciar uma requisição, aplique a codificação URI nas barras (/) da URL para convertê-las em %2F. Exemplo:

    &x-oss-credential=LTAI********************%2F20241203%2Fcn-hangzhou%2Foss%2Faliyun_v4_request
  • Parâmetros de query string

    Parâmetro

    Tipo

    Obrigatório

    Exemplo

    Descrição

    x-oss-signature-version

    String

    Sim

    OSS4-HMAC-SHA256

    A versão e o algoritmo da assinatura. Defina o valor como OSS4-HMAC-SHA256.

    x-oss-credential

    String

    Sim

    LTAI/20241203/cn-hangzhou/oss/aliyun_v4_request

    As credenciais usadas para calcular a assinatura. Formato:

    LTAI********************/<date>/<region>/oss/aliyun_v4_request
    • AccessKeyId: o AccessKey ID no par de AccessKey.

    • date: a data em que a requisição foi iniciada.

    • region: a região onde o recurso solicitado reside.

    • oss: o nome do service solicitado. Defina o valor como oss.

    • aliyun_v4_request: a descrição da versão de assinatura na requisição. Defina o valor como aliyun_v4_request.

    x-oss-date

    String

    Sim

    20241203T034420Z

    O horário em que a URL foi assinada. O horário segue o padrão ISO 8601 e é exibido em UTC.

    Nota

    Esse horário é usado como timestamp para a string a assinar. O valor deve ser idêntico ao do campo date na chave de assinatura derivada.

    x-oss-expires

    Integer

    Sim

    3600

    O período de validade da URL assinada, calculado a partir do valor do parâmetro x-oss-date. Unidade: segundos.

    • Ao usar um par de AccessKey, o valor deve estar entre 1 e 604.800 (7 dias).

    • Ao usar credenciais de acesso temporário obtidas pelo Security Token Service (STS), o valor deve estar entre 1 e 43.200 (12 horas).

    Nota

    O momento em que o OSS recebe a requisição (T) deve satisfazer a seguinte condição: (x-oss-date - 15 minutos) ≤ T ≤ (x-oss-date + x-oss-expires).

    • Se T for anterior ao valor (x-oss-date - 15 minutos), a requisição é inválida.

    • Se o horário atual for posterior ao valor (x-oss-date + x-oss-expires), a requisição é inválida.

    x-oss-additional-headers

    String

    Não

    host

    Os headers que você deseja incluir no cálculo da assinatura. Por exemplo, adicione o header host para impedir que o nome de domínio de origem da requisição seja alterado.

    Os requisitos para construção de um header são os seguintes:

    • Todos os headers no parâmetro x-oss-additional-headers devem estar em letras minúsculas.

    • Todos os headers no parâmetro x-oss-additional-headers devem estar em ordem alfabética.

    • Todos os headers do array são separados por ponto e vírgula (;) para formar uma string.

    x-oss-signature

    String

    Sim

    77Dv

    A descrição da verificação de assinatura. O parâmetro x-oss-signature não é incluído no cálculo da assinatura.

    x-oss-security-token

    String

    Não

    CAIS**

    O token de segurança emitido pelo STS. Este parâmetro é obrigatório apenas quando você usa um token de segurança para calcular a assinatura da URL.

Processo de cálculo de assinatura

image

O método usado para calcular uma assinatura para uma URL é semelhante ao utilizado para calcular uma assinatura para o cabeçalho Authorization. Os itens a seguir descrevem as diferenças entre os dois métodos:

  • O cabeçalho x-oss-content-sha256, que descreve o hash do payload, não é usado para calcular a assinatura de uma URL. Ao criar uma URL assinada, não é possível avaliar o conteúdo do payload. Em vez disso, utiliza-se UNSIGNED-PAYLOAD.

  • Se uma chave nos parâmetros de query string de uma URL assinada for igual a um cabeçalho a ser assinado, mas os valores forem diferentes, um erro será retornado. Se uma chave tiver múltiplos valores, todos os valores da chave serão comparados simultaneamente. Caso os valores sejam diferentes, um erro será retornado.

  • Se você usar as credenciais de acesso temporário obtidas do STS para acessar recursos do OSS em uma URL assinada, adicione o parâmetro x-oss-security-token à query string da URL.

  • O parâmetro x-oss-signature na query string não é incluído no cálculo da assinatura.

Etapa 1: Criar uma requisição canônica

Converta o conteúdo da sua requisição para o formato canônico.

Format

HTTP Verb + "\n" +
Canonical URI + "\n" +
Canonical Query String + "\n" +
Canonical Headers + "\n" +
Additional Headers + "\n" +
Hashed PayLoad

A tabela a seguir descreve os parâmetros mencionados acima.

Parameter

Type

Required

Example

Description

HTTP Verb

Enumeração

Sim

GET

O método HTTP, que pode ser PUT, GET, POST, HEAD, DELETE ou OPTIONS.

Nota

Canonical URI

String

Sim

/examplebucket/exampleobject

Uma string codificada por URI. Não codifique a barra (/) no caminho absoluto.

  • A URI começa com uma barra (/) após o nome de domínio e vai até o fim da string quando não há parâmetros de query string.

  • A URI começa com uma barra (/) após o nome de domínio e termina com um ponto de interrogação (?) quando há parâmetros de query string.

Os itens a seguir descrevem como especificar uma URI canônica com base nos recursos incluídos na URI da requisição:

  • Se a URI da requisição contiver tanto o nome do bucket quanto o nome do objeto, a URI canônica terá o seguinte formato:

    /examplebucket/exampleobject.

  • Se a URI da requisição contiver apenas o nome do bucket, a URI canônica terá o seguinte formato: /examplebucket/.

  • Se a URI da requisição contiver apenas o nome do objeto, a URI canônica será definida como /.

Canonical Query String

String

Sim

UriEncode("marker") + "=" + UriEncode("someMarker") + "&" + UriEncode("max-keys") + "=" + UriEncode("20") + "&" + UriEncode("prefix") + "=" + UriEncode("somePrefix")

Os parâmetros de query string codificados por URI. Codifique cada chave e valor individualmente por URI.

  • Ordene os parâmetros da query string canônica em ordem alfabética pelo nome da chave após codificá-los. Se houver chaves idênticas, ordene-as cronologicamente com base no momento em que foram adicionadas.

  • Se uma chave não tiver valor, inclua apenas a chave.

  • Se a requisição não incluir uma query string, defina a query string canônica como uma string vazia (""). Adicione uma quebra de linha ao final.

  • Se uma chave nos parâmetros de query string de uma URL assinada for igual a um cabeçalho a ser assinado, mas os valores forem diferentes, um erro será retornado. Se uma chave tiver múltiplos valores, todos serão comparados simultaneamente. Caso os valores sejam diferentes, um erro será retornado.

Canonical Headers

String

Sim

host:

examplebucket.oss-cn-hangzhou.aliyuncs.com

x-oss-content-sha256:

eee300fa39f52127a02af5f9bb86c0fd8b6776fc19101d9a6a7982c9d0edcc04

x-oss-date:

20241203T034420Z

Uma string obtida pela conversão da lista de cabeçalhos da requisição para o formato canônico. Adicione uma quebra de linha ao final da string.

  • A chave e o valor de um cabeçalho são separados por dois-pontos (:), e os cabeçalhos são separados por uma quebra de linha.

  • As chaves de cabeçalho devem estar em letras minúsculas e ordenadas alfabeticamente. Espaços no início ou no fim dos valores de cabeçalho devem ser removidos.

  • As chaves de cabeçalho são ordenadas em ordem alfabética.

  • O horário da requisição é especificado pelo cabeçalho x-oss-date. O horário segue o padrão ISO 8601 e é exibido em UTC. Exemplo: 20241203T034420Z.

  • O cabeçalho x-oss-content-sha256, que descreve o hash do payload, não é usado para calcular a assinatura de uma URL. Ao criar uma URL assinada, não é possível avaliar o conteúdo do payload. Em vez disso, utiliza-se UNSIGNED-PAYLOAD.

Os Canonical Headers se dividem em dois tipos:

  • Os cabeçalhos especificados em Additional Headers e usados para o cálculo da assinatura

  • Cabeçalhos que devem ser adicionados aos Canonical Headers quando presentes na requisição:

    • Content-Type

    • Content-MD5

    • x-oss-*

Additional Headers

String

Sim

content-length;host

Os cabeçalhos que você deseja incluir no cálculo da assinatura. Todas as chaves de cabeçalho devem estar em letras minúsculas e ordenadas alfabeticamente.

Hashed PayLoad

String

Sim

UNSIGNED-PAYLOAD

Valor válido: UNSIGNED-PAYLOAD.

Example

"GET" | "GET" | ... + "\n" +
UriEncode(<Resource>) + "\n" +
UriEncode(<QueryParam1>) + "=" + UriEncode(<Value>) + "&" + UriEncode(<QueryParam2>) + "\n" +
Lowercase(<HeaderName1>) + ":" + Trim(<value>) + "\n" + Lowercase(<HeaderName2>) + ":" + Trim(<value>) + "\n" + "\n"
Lowercase(<AdditionalHeaderName1>) + ";" + Lowercase(<AdditionalHeaderName2>) + "\n" +
UNSIGNED-PAYLOAD

Etapa 2: Criar uma string para assinar

Concatene as strings a seguir para criar a string a ser assinada.

Format

"OSS4-HMAC-SHA256" + "\n" +
dateTimeStr + "\n" +
dateStr + "\n" +
DigestUtils.sha256Hex(canonicalRequest);

Example

String stringToSign = "OSS4-HMAC-SHA256\n" +
                dateTimeStr + "\n" +
                dateStr + "/cn-hangzhou/oss/aliyun_v4_request\n" +
                DigestUtils.sha256Hex(canonicalRequest);

A tabela a seguir descreve os parâmetros.

Parameter

Type

Required

Sample file

Description

OSS4-HMAC-SHA256

Enumeração

Sim

OSS4-HMAC-SHA256

O algoritmo usado para criar o hash da requisição canônica. Defina o valor como OSS4-HMAC-SHA256.

dateTimeStr

String

Sim

20241203T034420Z

O horário atual em UTC. O horário deve seguir o padrão ISO 8601.

dateStr

String

Sim

20241203/cn-hangzhou/oss/aliyun_v4_request

As informações de escopo. Restringem a assinatura calculada à região e ao service especificados. Formato:

<SignDate>/<Region>/oss/aliyun_v4_request

  • SignDate: a data em que a requisição é iniciada.

  • Region: a região onde o recurso solicitado está localizado.

  • oss: o nome do service solicitado. Defina o valor como oss.

  • aliyun_v4_request: a descrição da versão da assinatura na requisição. Defina o valor como aliyun_v4_request.

CanonicalRequest

String

Sim

GET

/examplebucket/exampleobject

x-oss-additional-headers=host&x-oss-credential=LTAI%2F20241203%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-date=20241203T034420Z&x-oss-expires=86400&x-oss-signature-version=OSS4-HMAC-SHA256

host:examplebucket.oss-cn-hangzhou.aliyuncs.com

host

UNSIGNED-PAYLOAD

A string criada na Etapa 1.

Etapa 3: Calcular a assinatura

Crie uma chave de assinatura e use-a para calcular a assinatura.

  1. Calcule a chave de assinatura.

    HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("aliyun_v4" + accesskeysecret).getBytes(), dateStr), Region), "oss"), "aliyun_v4_request");
  2. Calcule a assinatura.

    BinaryUtil.toHex(HMAC-SHA256(SigningKey, StringToSign))

Código de exemplo completo para obtenção de uma URL assinada V4

O código a seguir demonstra como calcular uma assinatura V4 para gerar uma URL pré-assinada para requisições GET. Essa URL pré-assinada é válida apenas para operações de download e acesso.

Importante

Ao utilizar o código de exemplo a seguir, substitua as variáveis pelos valores reais. Por exemplo, substitua o Canonical URI por /examplebucket/exampleobject e a Region por cn-hangzhou.

import com.aliyun.oss.common.utils.BinaryUtil;
import org.apache.commons.codec.digest.DigestUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URL;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.TimeZone;

public class Demo {

    /**
     * Signature calculation tool
     *
     * @return url
     */
    public static void main(String[] args) throws Exception {
        // Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
        String accesskeyid =  System.getenv().get("OSS_ACCESS_KEY_ID");
        String accesskeysecret =  System.getenv().get("OSS_ACCESS_KEY_SECRET");
        // Query and display the current time. The time follows the ISO 8601 standard and is displayed in UTC.
        ZonedDateTime now = ZonedDateTime.now(TimeZone.getTimeZone("UTC").toZoneId());
        String dateStr = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String dateTimeStr = now.format(DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'"));
        // Step 1: Create a canonical request. 
        String canonicalRequest =
                "GET\n" +
                        "/examplebucket/exampleobject\n" +
                        "x-oss-additional-headers=host&x-oss-credential=" + accesskeyid + "%2F" + dateStr + "%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-date=" + dateTimeStr + "&x-oss-expires=86400&x-oss-signature-version=OSS4-HMAC-SHA256\n" +
                        "host:examplebucket.oss-cn-hangzhou.aliyuncs.com\n" +
                        "\n" +
                        "host\n" +
                        "UNSIGNED-PAYLOAD";
        System.out.println("canonicalRequest:" + canonicalRequest);
        // Step 2: Create a string to sign. 
        String stringToSign = "OSS4-HMAC-SHA256\n" +
                dateTimeStr + "\n" +
                dateStr + "/cn-hangzhou/oss/aliyun_v4_request\n" +
                DigestUtils.sha256Hex(canonicalRequest);

        // Step 3: Calculate the signature. 
        byte[] dateKey = hmacsha256(("aliyun_v4" + accesskeysecret).getBytes(), dateStr);
        byte[] dateRegionKey = hmacsha256(dateKey, "cn-hangzhou");
        byte[] dateRegionServiceKey = hmacsha256(dateRegionKey, "oss");
        byte[] signingKey = hmacsha256(dateRegionServiceKey, "aliyun_v4_request");

        byte[] result = hmacsha256(signingKey, stringToSign);
        String signature = BinaryUtil.toHex(result);
        System.out.println("signature:" + signature);

        // Step 4: Add the signature to the URL. 
        String resourcePath = "exampleobject";
        String endpoint = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com";
        String queryString = "x-oss-additional-headers=host&" +
                "x-oss-credential=" + accesskeyid + "%2F" + dateStr + "%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&" +
                "x-oss-date=" + dateTimeStr + "&" +
                "x-oss-expires=86400&" +
                "x-oss-signature=" + signature + "&" +
                "x-oss-signature-version=OSS4-HMAC-SHA256";

        String urlStr = endpoint + "/" + resourcePath + "?" + queryString;
        URL url = new URL(urlStr);
        System.out.println("url:" + url);
    }

    public static byte[] hmacsha256(byte[] key, String data) {
        try {
            // Initialize the HMAC key specifications, set the algorithm to HMAC-SHA256, and use the provided key. 
            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "HmacSHA256");

            // Obtain a Mac instance and use the getInstance method to set the algorithm to HMAC-SHA256. 
            Mac mac = Mac.getInstance("HmacSHA256");
            // Use the key to initialize the Mac instance. 
            mac.init(secretKeySpec);

            // Calculate the HMAC. Use the doFinal method to process the data and return the result as a byte array. 
            byte[] hmacBytes = mac.doFinal(data.getBytes());

            return hmacBytes;
        } catch (Exception e) {
            throw new RuntimeException("Failed to calculate HMAC-SHA256", e);
        }
    }
}

Exemplo de saída:

signature:eee300fa39f52127a02af5f9bb86c0fd8b6776fc19101d9a6a7982c9d0edcc04
url:https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject?x-oss-additional-headers=host&x-oss-credential=LTAI********************%2F20241203%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-date=20241203T032307Z&x-oss-expires=86400&x-oss-signature=eee300fa39f52127a02af5f9bb86c0fd8b6776fc19101d9a6a7982c9d0edcc04&x-oss-signature-version=OSS4-HMAC-SHA256

Referências