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

Object Storage Service:(推奨)事前署名済み URL での V4 署名

最終更新日:Aug 12, 2025

認証情報を提供するための HTTP Authorization ヘッダーの使用に加えて、署名とその他の必要なリクエスト情報を含む事前署名済み URL を生成できます。 これにより、アクセス認証情報を公開することなく、Object Storage Service (OSS) リソースへの一時的なアクセス権をサードパーティに付与できます。 このトピックでは、V4 署名アルゴリズムを使用して事前署名済み URL を作成する方法について説明します。

OSS SDK を使用した V4 署名の自動実装

OSS SDK は、V4 署名の自動実装をサポートしています。 リクエストを開始するには、OSS SDK を使用することをお勧めします。 これにより、署名を手動で計算する必要がなくなります。 特定のプログラミング言語の署名実装の詳細については、そのプログラミング言語の OSS SDK のサンプルコードを参照してください。 次の表は、さまざまなプログラミング言語の OSS SDK を使用する場合に、V4 署名アルゴリズムを使用してリクエストに署名するために使用されるサンプルコードへの参照を示しています。

SDK

サンプルコード

Java

クライアントの設定

OSSV4Signer.java

PHP

クライアントの設定

SignerV4.php

Node.js

初期化

signatureUrlV4.js

Browser.js

初期化

Python

初期化 (Python SDK V1)

auth.py

Go

OSSClient インスタンスの設定

v4.go

Objective-C

初期化

OSSV4Signer.m

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********************/<日付>/<リージョン>/oss/aliyun_v4_request
    • AccessKeyId:AccessKey ペアの AccessKey ID。

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

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

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

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

    x-oss-date

    文字列

    はい

    20241203T034420Z

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

    説明

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

    x-oss-expires

    整数

    はい

    3600

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

    • AccessKey ペアを使用する場合、値は 1 ~ 604,800(7 日間)である必要があります。

    • Security Token Service (STS) から取得した一時的なアクセス認証情報を使用する場合、値は 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 つの方法の違いは次のとおりです。

  • ペイロードハッシュを記述する x-oss-content-sha256 ヘッダーは、URL の署名の計算には使用されません。 署名付き 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 は次のフォーマットになります。

    リクエスト 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。

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

Canonical Headers は次の 2 つのタイプに分けられます。

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

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

    • Content-Type

    • Content-MD5

    • x-oss-*

Additional Headers

文字列

はい

content-length;host

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

Hashed PayLoad

文字列

はい

UNSIGNED-PAYLOAD

有効な値:UNSIGNED-PAYLOAD。

"GET" | "GET" | ... + "\n" +
UriEncode(<リソース>) + "\n" +
UriEncode(<QueryParam1>) + "=" + UriEncode(<値>) + "&" + UriEncode(<QueryParam2>) + "\n" +
Lowercase(<HeaderName1>) + ":" + Trim(<値>) + "\n" + Lowercase(<HeaderName2>) + ":" + Trim(<値>) + "\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

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

<署名日付>/<リージョン>/oss/aliyun_v4_request

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

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

  • 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 を取得するために使用される完全なサンプルコード

次のコードは、GET リクエストの事前署名済み URL を生成するために V4 署名を計算する方法の例を示しています。 この事前署名済み 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 {

    /**
     * 署名計算ツール
     *
     * @return url
     */
    public static void main(String[] args) throws Exception {
        // サンプルコードを実行する前に、OSS_ACCESS_KEY_ID 環境変数と OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        String accesskeyid =  System.getenv().get("OSS_ACCESS_KEY_ID");
        String accesskeysecret =  System.getenv().get("OSS_ACCESS_KEY_SECRET");
        // 現在の時刻をクエリして表示します。 時刻は ISO 8601 標準に準拠し、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'"));
        // ステップ 1:正規リクエストを作成します。
        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);
        // ステップ 2:署名対象文字列を作成します。
        String stringToSign = "OSS4-HMAC-SHA256\n" +
                dateTimeStr + "\n" +
                dateStr + "/cn-hangzhou/oss/aliyun_v4_request\n" +
                DigestUtils.sha256Hex(canonicalRequest);

        // ステップ 3:署名を計算します。
        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);

        // ステップ 4: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 {
            // HMAC キー仕様を初期化し、アルゴリズムを HMAC-SHA256 に設定し、指定されたキーを使用します。
            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "HmacSHA256");

            // Mac インスタンスを取得し、getInstance メソッドを使用してアルゴリズムを HMAC-SHA256 に設定します。
            Mac mac = Mac.getInstance("HmacSHA256");
            // キーを使用して Mac インスタンスを初期化します。
            mac.init(secretKeySpec);

            // HMAC を計算します。 doFinal メソッドを使用してデータを処理し、結果をバイト配列として返します。
            byte[] hmacBytes = mac.doFinal(data.getBytes());

            return hmacBytes;
        } catch (Exception e) {
            throw new RuntimeException("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

参考資料