すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:(推奨) URL に V4 署名を含める

最終更新日:Jun 27, 2025

HTTP Authorization ヘッダーを用いて認証情報を提供する方法に加え、署名付き URL でリクエストを行う際には、クエリ文字列パラメーターを使用してリクエストを認証することも可能です。この方法では、アクセスクレデンシャルを公開することなく、特定の Object Storage Service (OSS) リソースへの一時的なアクセス権限をユーザーに付与できます。 このトピックでは、URL に V4 署名を含める方法について説明します。

OSS SDK を使用して V4 署名を自動的に実装する

OSS SDK は、V4 署名の自動実装をサポートしています。 リクエストを開始するには、OSS SDK を使用することをお勧めします。 これにより、署名を手動で計算する必要がなくなります。 特定のプログラミング言語の署名実装の詳細については、以下の表にある OSS SDK のサンプルコードファイルを参照してください。

SDK

サンプルコード

Java

クライアントを設定する

OSSV4Signer.java

PHP

クライアントを設定する

SignerV4.php

Node.js

初期化

signatureUrlV4.js

Browser.js

初期化

Python

OSSClient インスタンスを設定する

v4.py

Go

OSSClient インスタンスを設定する

v4.go

C++

初期化

SignerV4.cc

C

初期化

oss_auth.c

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=20241203T034420Z&x-oss-expires=86400&x-oss-signature=70c542eaf652ac291c0c343d63ac24ede41c0526661d9d4c63c0906a2686160c&x-oss-signature-version=OSS4-HMAC-SHA256

    読みやすくするために、上記の URL の x-oss-credential パラメーターの値はスラッシュ (/) で区切られています。 リクエストを開始するときは、URL 内のスラッシュ (/) を URI エンコードして %2F に変換します。 例:

    &x-oss-credential=LTAI********************%2F20241203%2Fcn-hangzhou%2Foss%2Faliyun_v4_request
  • クエリ文字列パラメーター

    パラメーター

    タイプ

    必須

    説明

    x-oss-signature-version

    文字列

    はい

    OSS4-HMAC-SHA256

    署名のバージョンとアルゴリズム。 値を OSS4-HMAC-SHA256 に設定します。

    x-oss-credential

    文字列

    はい

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

    署名の計算に使用できるクレデンシャル。 形式:

    LTAI********************/<date>/<region>/oss/aliyun_v4_request
    • AccessKeyId:AccessKey ペアの AccessKey ID。

    • date:リクエストが開始された日付。

    • region:リクエストされたリソースが存在するリージョン。

    • oss:リクエストされたサービスの名前。 値を oss に設定します。

    • aliyun_v4_request:リクエストの署名バージョンの説明。 値を aliyun_v4_request に設定します。

    x-oss-date

    文字列

    はい

    20241203T034420Z

    URL が署名された日時。ISO 8601 標準に準拠し、UTC で表示されます。

    説明

    日時は、署名対象文字列のタイムスタンプとして使用されます。 値は、派生署名キーの date フィールドの値と同じである必要があります。

    x-oss-expires

    整数

    はい

    3600

    署名付き URL の有効期間。x-oss-date パラメーターの値から計算されます。 単位:秒。

    • AccessKey ペアを使用して生成された署名付き URL の有効期間は、次の要件を満たす必要があります。最小値:1 秒。 最大値:604,800 秒 (7 日間)。

    • Security Token Service (STS) から取得した一時的なアクセスクレデンシャルを使用して生成された署名付き URL の有効期間は、次の要件を満たす必要があります。最小値:1 秒。 最大値:43,200 秒 (12 時間)。

    説明

    OSS がリクエストを受信する日時 (T) は、次の要件を満たす必要があります。(x-oss-date - 15 分) ≤ T ≤ (x-oss-date + x-oss-expires)。

    • T が値 (x-oss-date - 15 分) より前の場合、リクエストは無効です。

    • 現在の日時が (x-oss-date + x-oss-expires) より後の場合、リクエストは無効です。

    x-oss-additional-headers

    文字列

    いいえ

    host

    署名の計算に追加するヘッダー。 たとえば、host ヘッダーを追加して、リクエストが開始されるドメイン名が変更されないようにすることができます。

    ヘッダーを作成するための要件は以下のとおりです。

    • x-oss-additional-headers パラメーターのすべてのヘッダーは小文字にする必要があります。

    • x-oss-additional-headers パラメーターのすべてのヘッダーはアルファベット順にソートする必要があります。

    • 配列内のすべてのヘッダーはセミコロン (;) で区切って文字列にします。

    x-oss-signature

    文字列

    はい

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

    署名検証の説明。 x-oss-signature パラメーターは署名の計算には含まれません。

    x-oss-security-token

    文字列

    いいえ

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

    STS によって発行されたセキュリティトークン。 このパラメーターは、セキュリティトークンを使用して URL の署名を計算する場合にのみ必要です。

署名計算プロセス

image

URL の署名を計算する方法は、Authorization ヘッダーの署名を計算する方法と似ています。 以下では、2 つの方法の違いについて説明します。

  • 署名付き URL を作成する場合、ペイロードコンテンツを評価できないため、ペイロードハッシュを記述する x-oss-content-sha256 ヘッダーは、URL の署名の計算には使用されません。その代わりに、UNSIGNED-PAYLOAD が使用されます。

  • 署名付き URL のクエリ文字列パラメーターのキーが署名対象のヘッダーと同じであるが、値が異なる場合、エラーが報告されます。 キーに複数の値がある場合、キーのすべての値は同時に比較されます。 値が異なる場合、エラーが報告されます。

  • STS から取得した一時的なアクセスクレデンシャルを使用して署名付き URL で OSS リソースにアクセスする場合は、URL のクエリ文字列に x-oss-security-token パラメーターを追加する必要があります。

  • クエリ文字列の x-oss-signature パラメーターは署名の計算には含まれません。

手順 1: 正規リクエストを作成する

リクエストのコンテンツを正規形式に変換します。

形式

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

以下の表は、上記のパラメーターについて説明します。

パラメーター

タイプ

必須

説明

HTTP Verb

列挙型

はい

GET

HTTP メソッド。PUT、GET、POST、HEAD、DELETE、または OPTIONS を使用できます。

説明

Canonical URI

文字列

はい

/examplebucket/exampleobject

URI エンコードされた文字列。 絶対パスにおいて、スラッシュ (/) 以外のすべての文字をエンコードします。

  • URI は、クエリ文字列パラメーターが含まれていない場合、ドメイン名の後に続くスラッシュ (/) で始まり、文字列の末尾まで続きます。

  • URI は、クエリ文字列パラメーターが含まれている場合、ドメイン名の後に続くスラッシュ (/) で始まり、疑問符 (?) で終わります。

リクエスト URI に含まれるリソースに基づいて正規 URI を指定する方法は以下のとおりです。

  • リクエスト URI にバケット名とオブジェクト名の両方が含まれている場合、正規 URI は /examplebucket/exampleobject の形式になります。

  • リクエスト URI にバケット名のみが含まれている場合、正規 URI は /examplebucket/ の形式になります。

  • リクエスト URI にオブジェクト名のみが含まれている場合、正規 URI は / に設定されます。

Canonical Query String

文字列

はい

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

URI エンコードされたクエリ文字列パラメーター。 各キーと値を個別に URI エンコードする必要があります。

  • パラメーターをエンコードした後、正規クエリ文字列のパラメーターをキー名でアルファベット順にソートします。 同じキーが存在する場合は、追加された日時に基づいてキーを時系列順にソートします。

  • キーに値がない場合は、キーのみを追加します。

  • リクエストにクエリ文字列が含まれていない場合は、正規クエリ文字列を空の文字列 ("") に設定します。 最後に改行コードを追加する必要があります。

  • 署名付き URL のクエリ文字列パラメーターのキーが署名対象のヘッダーと同じであるが、値が異なる場合、エラーが報告されます。 キーに複数の値がある場合、キーのすべての値が同時に比較されます。 値が異なる場合、エラーが報告されます。

Canonical Headers

文字列

はい

host:

examplebucket.oss-cn-hangzhou.aliyuncs.com

x-oss-content-sha256:

eee300fa39f52127a02af5f9bb86c0fd8b6776fc19101d9a6a7982c9d0edcc04

x-oss-date:

20241203T034420Z

リクエストヘッダーのリストを正規形式に変換して取得した文字列。 文字列の最後に改行コードを追加します。

  • ヘッダーのキーと値はコロン (:) で区切り、複数のヘッダーは改行コードで区切ります。

  • ヘッダーキーは小文字にし、アルファベット順にソートする必要があります。 ヘッダー値の先頭または末尾のスペースはトリミングする必要があります。

  • ヘッダーキーはアルファベット順にソートされます。

  • リクエスト日時は x-oss-date ヘッダーで指定されます。ISO 8601 標準に準拠し、UTC で表示されます。 例:20241203T034420Z。

  • 署名付き URL を作成する場合、ペイロードコンテンツを評価できないため、 ペイロードハッシュを記述する x-oss-content-sha256 ヘッダーは、URL の署名の計算には使用されません。 その代わりに、UNSIGNED-PAYLOAD が使用されます。

Canonical ヘッダーは以下の 2 種類があります。

  • Additional ヘッダーで指定され、署名の計算に使用されるヘッダー

  • あるヘッダーがリクエストに含まれている場合、そのヘッダーを Canonical ヘッダーに追加する必要があります:

    • Content-Type

    • Content-MD5

    • x-oss-*

Additional Headers

文字列

はい

content-length;host

署名の計算に追加するヘッダー。 すべてのヘッダーキーは小文字にし、アルファベット順にソートする必要があります。

Hashed PayLoad

文字列

はい

UNSIGNED-PAYLOAD

有効な値:UNSIGNED-PAYLOAD。

"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

手順 2: 署名対象の文字列を作成する

以下の文字列を連結して、署名対象の文字列を作成します。

形式

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

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

以下の表は、上記のパラメーターについて説明します。

パラメーター

タイプ

必須

説明

OSS4-HMAC-SHA256

列挙型

はい

OSS4-HMAC-SHA256

正規リクエストのハッシュを作成するために使用されるアルゴリズム。 値を OSS4-HMAC-SHA256 に設定します。

dateTimeStr

文字列

はい

20241203T034420Z

UTC での現在の日時。ISO 8601 標準に準拠する必要があります。

dateStr

文字列

はい

20241203/cn-hangzhou/oss/aliyun_v4_request

範囲情報。 これにより、計算された署名が指定されたリージョンとサービスに制限されます。 形式:

<SignDate>/<Region>/oss/aliyun_v4_request

  • SignDate:リクエストが開始された日付。

  • Region:リクエストされたリソースが存在するリージョン。

  • oss:リクエストされたサービスの名前。 値を oss に設定します。

  • aliyun_v4_request:リクエストの署名バージョンの説明。 値を aliyun_v4_request に設定します。

CanonicalRequest

文字列

はい

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

手順 1 で作成された文字列。

手順 3: 署名を計算する

署名キーを作成し、その署名キーを使用して署名を計算します。

  1. 署名キーを計算します。

    HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("aliyun_v4" + accesskeysecret).getBytes(), dateStr), Region), "oss"), "aliyun_v4_request");
  2. 署名を計算します。

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

V4 署名付き URL を取得するために使用される完全なサンプルコード

以下のサンプルコードは、Java の OSS SDK を使用して V4 署名付き URL を計算する方法の例を示しています。 この URL は、オブジェクトのダウンロードとアクセスにのみ使用できます。

重要

以下のサンプルコードを使用する場合は、変数を実際の値に置き換える必要があります。 たとえば、Canonical URI を /examplebucket/exampleobject に、Region を 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 value. Use the doFinal method to receive the data to be calculated and return the calculation results in arrays. 
            byte[] hmacBytes = mac.doFinal(data.getBytes());

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

サンプル出力:

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

関連情報