全部产品
Search
文档中心

Object Storage Service:(Direkomendasikan) Tanda Tangan V4 dalam URL yang Ditandatangani

更新时间:Aug 12, 2025

Selain menggunakan header Authorization HTTP untuk menyediakan informasi otentikasi, Anda dapat membuat URL yang ditandatangani yang mencakup tanda tangan dan informasi permintaan lainnya yang diperlukan. Hal ini memungkinkan Anda memberikan akses sementara ke sumber daya Object Storage Service (OSS) kepada pihak ketiga tanpa mengekspos kredensial akses Anda. Topik ini menjelaskan cara menggunakan algoritma tanda tangan V4 untuk membuat URL yang ditandatangani.

Gunakan SDK OSS untuk secara otomatis mengimplementasikan tanda tangan V4

SDK OSS mendukung implementasi otomatis tanda tangan V4. Kami merekomendasikan agar Anda menggunakan SDK OSS untuk memulai permintaan, sehingga tidak perlu menghitung tanda tangan secara manual. Untuk informasi lebih lanjut tentang implementasi tanda tangan untuk bahasa pemrograman tertentu, lihat kode contoh dari SDK OSS untuk bahasa pemrograman tersebut. Tabel berikut memberikan referensi ke kode contoh yang digunakan untuk menandatangani permintaan dengan menggunakan algoritma tanda tangan V4 saat menggunakan SDK OSS untuk berbagai bahasa pemrograman.

SDK

Contoh

Kode contoh

Java

Konfigurasikan klien

OSSV4Signer.java

PHP

Konfigurasikan klien

SignerV4.php

Node.js

Inisialisasi

signatureUrlV4.js

Browser.js

Inisialisasi

Python

Inisialisasi (Python SDK V1)

auth.py

Go

Konfigurasikan instance OSSClient

v4.go

Objective-C

Inisialisasi

OSSV4Signer.m

C++

Inisialisasi

SignerV4.cc

C

Inisialisasi

oss_auth.c

Penandatanganan URL

  • Contoh

    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

    Untuk kemudahan pembacaan, bidang-bidang dalam parameter x-oss-credential di URL sebelumnya dipisahkan oleh garis miring (/). Saat memulai permintaan, URI-encode garis miring (/) di URL untuk mengonversinya menjadi %2F. Contoh:

    &x-oss-credential=LTAI********************%2F20241203%2Fcn-hangzhou%2Foss%2Faliyun_v4_request
  • Parameter string kueri

    Parameter

    Tipe

    Diperlukan

    Contoh

    Deskripsi

    x-oss-signature-version

    String

    Ya

    OSS4-HMAC-SHA256

    Versi dan algoritma dari tanda tangan. Atur nilainya menjadi OSS4-HMAC-SHA256.

    x-oss-credential

    String

    Ya

    LTAI********************/20241203/cn-hangzhou/oss/aliyun_v4_request

    Kredensial yang dapat Anda gunakan untuk menghitung tanda tangan. Format:

    LTAI********************/<date>/<region>/oss/aliyun_v4_request
    • AccessKeyId: ID AccessKey dalam pasangan AccessKey.

    • date: tanggal ketika permintaan dimulai.

    • region: wilayah tempat sumber daya yang diminta berada.

    • oss: nama layanan yang diminta. Atur nilainya menjadi oss.

    • aliyun_v4_request: deskripsi versi tanda tangan dalam permintaan. Atur nilainya menjadi aliyun_v4_request.

    x-oss-date

    String

    Ya

    20241203T034420Z

    Waktu ketika URL ditandatangani. Waktu mengikuti standar ISO 8601 dan ditampilkan dalam UTC.

    Catatan

    Waktu ini digunakan sebagai timestamp untuk string yang akan ditandatangani. Nilainya harus sama dengan nilai bidang date dalam kunci penandatanganan yang diperoleh.

    x-oss-expires

    Integer

    Ya

    3600

    Masa berlaku URL yang ditandatangani. Periode validitas dihitung dari nilai parameter x-oss-date. Unit: detik.

    • Jika Anda menggunakan pasangan AccessKey, nilainya harus antara 1 dan 604.800 (7 hari).

    • Jika Anda menggunakan kredensial akses sementara yang diperoleh dari Security Token Service (STS), nilainya harus antara 1 dan 43.200 (12 jam).

    Catatan

    Titik waktu ketika OSS menerima permintaan (T) harus memenuhi persyaratan berikut: (x-oss-date - 15 menit) ≤ T ≤ (x-oss-date + x-oss-expires).

    • Jika T lebih awal dari nilai (x-oss-date - 15 menit), permintaan tidak valid.

    • Jika waktu saat ini lebih lambat dari nilai (x-oss-date + x-oss-expires), permintaan tidak valid.

    x-oss-additional-headers

    String

    Tidak

    host

    Header yang ingin Anda tambahkan untuk menghitung tanda tangan. Misalnya, Anda dapat menambahkan header host untuk mencegah domain tempat permintaan dimulai dari diubah.

    Item berikut menggambarkan persyaratan untuk membangun header:

    • Semua header dalam parameter x-oss-additional-headers harus dalam huruf kecil.

    • Semua header dalam parameter x-oss-additional-headers harus diurutkan secara alfabetis.

    • Semua header dalam array dipisahkan oleh titik koma (;) untuk mendapatkan string.

    x-oss-signature

    String

    Ya

    77Dv****************

    Deskripsi verifikasi tanda tangan. Parameter x-oss-signature tidak disertakan dalam perhitungan tanda tangan.

    x-oss-security-token

    String

    Tidak

    CAIS********************************

    Token keamanan yang dikeluarkan oleh STS. Parameter ini hanya diperlukan jika Anda menggunakan token keamanan untuk menghitung tanda tangan untuk URL.

Proses perhitungan tanda tangan

Metode yang digunakan untuk menghitung tanda tangan untuk URL serupa dengan metode yang digunakan untuk menghitung tanda tangan untuk header Otorisasi. Berikut adalah perbedaan utama antara kedua metode:

  • Header x-oss-content-sha256 yang menggambarkan hash payload tidak digunakan untuk menghitung tanda tangan untuk URL. Saat membuat URL yang ditandatangani, Anda tidak dapat mengevaluasi konten payload. Sebagai gantinya, UNSIGNED-PAYLOAD digunakan.

  • Jika kunci dalam parameter string kueri URL yang ditandatangani sama dengan header yang akan ditandatangani tetapi nilainya berbeda, kesalahan dilaporkan. Jika sebuah kunci memiliki beberapa nilai, semua nilai dari kunci dibandingkan pada saat yang sama. Jika nilainya berbeda, kesalahan dilaporkan.

  • Jika Anda menggunakan kredensial akses sementara yang diperoleh dari STS untuk mengakses sumber daya OSS dalam URL yang ditandatangani, Anda harus menambahkan parameter x-oss-security-token ke string kueri URL.

  • Parameter x-oss-signature dalam string kueri tidak disertakan dalam perhitungan tanda tangan.

Langkah 1: Buat permintaan kanonikal

Konversikan konten permintaan Anda ke format kanonikal.

Format

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

Tabel berikut menggambarkan parameter sebelumnya.

Parameter

Tipe

Diperlukan

Contoh

Deskripsi

HTTP Verb

Enumerasi

Ya

GET

Metode HTTP, yang bisa berupa PUT, GET, POST, HEAD, DELETE, atau OPTIONS.

Catatan

Canonical URI

String

Ya

/examplebucket/exampleobject

String yang di-URI-encode. Jangan encode garis miring (/) dalam jalur mutlak.

  • URI dimulai dengan garis miring (/) yang mengikuti nama domain hingga akhir string jika parameter string kueri tidak disertakan.

  • URI dimulai dengan garis miring (/) yang mengikuti nama domain dan berakhir dengan tanda tanya (?) jika parameter string kueri disertakan.

Item berikut menggambarkan cara menentukan URI kanonikal berdasarkan sumber daya yang disertakan dalam URI permintaan:

  • Jika URI permintaan berisi nama bucket dan nama objek, URI kanonikal berada dalam format berikut:

    /examplebucket/exampleobject.

  • Jika URI permintaan hanya berisi nama bucket, URI kanonikal berada dalam format berikut: /examplebucket/.

  • Jika URI permintaan hanya berisi nama objek, URI kanonikal diatur ke /.

Canonical Query String

String

Ya

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

Parameter string kueri yang di-URI-encode. Anda harus URI-encode setiap kunci dan nilai secara individual.

  • Urutkan parameter dalam string kueri kanonikal secara alfabetis berdasarkan nama kunci setelah Anda meng-encode parameter. Jika kunci identik ada, urutkan kunci berdasarkan urutan kronologis berdasarkan waktu ketika mereka ditambahkan.

  • Jika sebuah kunci tidak memiliki nilai, tambahkan hanya kunci.

  • Jika permintaan tidak termasuk string kueri, atur string kueri kanonikal ke string kosong (""). Anda harus menambahkan baris baru di akhir.

  • Jika kunci dalam parameter string kueri URL yang ditandatangani sama dengan header yang akan ditandatangani tetapi nilainya berbeda, kesalahan dilaporkan. Jika sebuah kunci memiliki beberapa nilai, semua nilai dari kunci dibandingkan pada saat yang sama. Jika nilainya berbeda, kesalahan dilaporkan.

Canonical Headers

String

Ya

host:

examplebucket.oss-cn-hangzhou.aliyuncs.com

x-oss-content-sha256:

eee300fa39f52127a02af5f9bb86c0fd8b6776fc19101d9a6a7982c9d0edcc04

x-oss-date:

20241203T034420Z

String yang diperoleh dengan mengonversi daftar header permintaan ke format kanonikal. Tambahkan baris baru di akhir string.

  • Nama kunci header dan nilai dipisahkan oleh titik dua (:), dan header dipisahkan oleh baris baru.

  • Kunci header harus dalam huruf kecil dan diurutkan secara alfabetis. Spasi di awal atau akhir nilai header harus dihapus.

  • Kunci header diurutkan secara alfabetis.

  • Waktu permintaan ditentukan oleh header x-oss-date. Waktu mengikuti standar ISO 8601 dan ditampilkan dalam UTC. Contoh: 20241203T034420Z.

  • Header x-oss-content-sha256 yang menggambarkan hash payload tidak digunakan untuk menghitung tanda tangan untuk URL. Saat Anda membuat URL yang ditandatangani, Anda tidak dapat mengevaluasi konten payload. Sebagai gantinya, UNSIGNED-PAYLOAD digunakan.

Canonical Headers dibagi menjadi dua jenis:

  • Header yang ditentukan oleh Additional Headers dan digunakan untuk perhitungan tanda tangan

  • Header yang harus ditambahkan ke Canonical Headers jika ada dalam permintaan:

    • Content-Type

    • Content-MD5

    • x-oss-*

Additional Headers

String

Ya

content-length;host

Header yang ingin Anda tambahkan untuk menghitung tanda tangan. Semua kunci header harus dalam huruf kecil dan diurutkan secara alfabetis.

Hashed PayLoad

String

Ya

UNSIGNED-PAYLOAD

Nilai valid: UNSIGNED-PAYLOAD.

Contoh

"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

Langkah 2: Buat string untuk ditandatangani

Gabungkan string berikut untuk membuat string yang akan ditandatangani.

Format

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

Contoh

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

Tabel berikut menggambarkan parameter.

Parameter

Tipe

Diperlukan

File contoh

Deskripsi

OSS4-HMAC-SHA256

Enumerasi

Ya

OSS4-HMAC-SHA256

Algoritma yang digunakan untuk membuat hash dari permintaan kanonikal. Atur nilainya menjadi OSS4-HMAC-SHA256.

dateTimeStr

String

Ya

20241203T034420Z

Waktu saat ini dalam UTC. Waktu harus mengikuti standar ISO 8601.

dateStr

String

Ya

20241203/cn-hangzhou/oss/aliyun_v4_request

Informasi ruang lingkup. Ini membatasi tanda tangan yang dihitung ke wilayah dan layanan tertentu. Format:

<SignDate>/<Region>/oss/aliyun_v4_request

  • SignDate: tanggal ketika permintaan dimulai.

  • Region: wilayah tempat sumber daya yang diminta berada.

  • oss: nama layanan yang diminta. Atur nilainya menjadi oss.

  • aliyun_v4_request: deskripsi versi tanda tangan dalam permintaan. Atur nilainya menjadi aliyun_v4_request.

CanonicalRequest

String

Ya

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

String yang dibuat di Langkah 1.

Langkah 3: Hitung tanda tangan

Buat kunci penandatanganan dan gunakan kunci penandatanganan untuk menghitung tanda tangan.

  1. Hitung kunci penandatanganan.

    HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("aliyun_v4" + accesskeysecret).getBytes(), dateStr), Region), "oss"), "aliyun_v4_request");
  2. Hitung tanda tangan.

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

Kode contoh lengkap untuk mendapatkan URL yang ditandatangani V4

Kode berikut memberikan contoh cara menghitung tanda tangan V4 untuk menghasilkan URL yang telah ditandatangani untuk permintaan GET. URL yang telah ditandatangani ini hanya dapat digunakan untuk operasi unduhan dan akses.

Penting

Saat menggunakan kode contoh berikut, Anda harus mengganti variabel dengan nilai sebenarnya. Misalnya, ganti Canonical URI dengan /examplebucket/exampleobject dan Region dengan 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 {

    /**
     * Alat perhitungan tanda tangan
     *
     * @return url
     */
    public static void main(String[] args) throws Exception {
        // Sebelum menjalankan kode contoh, pastikan bahwa variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET dikonfigurasi.
        String accesskeyid =  System.getenv().get("OSS_ACCESS_KEY_ID");
        String accesskeysecret =  System.getenv().get("OSS_ACCESS_KEY_SECRET");
        // Kueri dan tampilkan waktu saat ini. Waktu mengikuti standar ISO 8601 dan ditampilkan dalam 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'"));
        // Langkah 1: Buat permintaan kanonik.
        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);
        // Langkah 2: Buat string untuk ditandatangani.
        String stringToSign = "OSS4-HMAC-SHA256\n" +
                dateTimeStr + "\n" +
                dateStr + "/cn-hangzhou/oss/aliyun_v4_request\n" +
                DigestUtils.sha256Hex(canonicalRequest);

        // Langkah 3: Hitung tanda tangan.
        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);

        // Langkah 4: Tambahkan tanda tangan ke 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 {
            // Inisialisasi spesifikasi kunci HMAC, atur algoritma ke HMAC-SHA256, dan gunakan kunci yang disediakan.
            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "HmacSHA256");

            // Dapatkan instance Mac dan gunakan metode getInstance untuk mengatur algoritma ke HMAC-SHA256.
            Mac mac = Mac.getInstance("HmacSHA256");
            // Gunakan kunci untuk menginisialisasi instance Mac.
            mac.init(secretKeySpec);

            // Hitung HMAC. Gunakan metode doFinal untuk memproses data dan kembalikan hasilnya sebagai array byte.
            byte[] hmacBytes = mac.doFinal(data.getBytes());

            return hmacBytes;
        } catch (Exception e) {
            throw new RuntimeException("Gagal menghitung HMAC-SHA256", e);
        }
    }
}

Contoh keluaran:

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

Referensi