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

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

最終更新日:May 13, 2024

認証情報を提供するためにHTTP Authorizationヘッダーを使用することに加えて、リクエスト全体をURLで表現する場合に、クエリ文字列パラメーターを使用してリクエストを認証できます。 これにより、アクセス資格情報を公開することなく、指定されたObject Storage Service (OSS) リソースに対する一時的なアクセス権限をユーザーに付与できます。 このトピックでは、URLにV4署名を含める方法について説明します。

OSS SDKを使用したV4シグネチャの自動実装

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

SDK

サンプルコード

Java

初期化

OSSV4Signer.java

PHP

初期化

SignerV4.php

Node.js

初期化

signatureUrlV4.js

Browser.js

初期化

Python

初期化

auth.py

Go

初期化

v4.go

C++

初期化

SignerV4.cc

C

初期化

oss_auth.c

URL署名

  • 例:

    https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject?x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=<AccessKeyId>/20231203/cn-hangzhou/oss/aliyun_v4_request&x-oss-date=20231203T1212Z&x-oss-expires=86400&x-oss-additional-headers=host&x-oss-signature=<signature-to-be-calculated>

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

    &x-oss-credential=<AccessKeyId>% 2F20231203% 2Fcn-hangzhou % 2Foss % 2Faliyun_v4_request
  • クエリ文字列パラメーター

    パラメーター

    データ型

    必須

    説明

    x-oss-signature-version

    String

    必須

    OSS4-HMAC-SHA256

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

    x-oss-credential

    String

    必須

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

    署名の計算に使用できる資格情報。 形式:

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

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

    • region: 要求されたリソースが存在するリージョン。

    • oss: 要求されたサービスの名前。 有効値: oss。

    • aliyun_v4_request: リクエスト内の署名バージョンの説明。 有効値: aliyun_v4_request

    x-oss-date

    String

    必須

    20231203T1212Z

    URLが署名された時刻。 時間はISO 8601標準に従います。 時間差を避けるために、URLが署名されてから15分のオフセットが許可されています。

    説明

    時間は、文字列が署名するためのタイムスタンプとして使用されます。 値は、派生署名キーの日付フィールドの値と同じでなければなりません。

    x-oss-expires

    Integer

    3600

    署名付きURLの有効期間。 単位は秒です。 最小値:1 最大値: 604800。

    x-oss-additional-headers

    String

    任意

    host

    署名を計算するために追加するヘッダー。 リクエストに含めるすべてのリクエストヘッダーに署名することをお勧めします。

    パラメータを作成するための要件を次に示します。

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

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

    • 配列内のすべてのヘッダーは、文字列を取得するためにセミコロン (;) で区切られます。

    x-oss-signature

    String

    必須

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

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

    x-oss-security-token

    String

    任意

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

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

署名計算プロセス

image

URLの署名を計算するために使用される方法は、Authorizationヘッダーの署名を計算するために使用される方法と同様である。 次の項目は、2つの方法の違いを説明します。

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

  • 署名を計算するために追加するヘッダーには、Content-TypeとContent-MD5は含まれません。

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

  • STSから取得したアクセス資格情報を使用して署名付きURLのOSSリソースにアクセスする場合は、x-oss-security-tokenパラメーターをURLのクエリ文字列に追加する必要があります。

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

ステップ1: 正規リクエストを作成する

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

Format

HTTP動詞 + "\n" +
正規URI + "\n" +
正規クエリ文字列 + "\n" +
Canonicalヘッダー + "\n" +
追加ヘッダー + "\n" +
ハッシュペイロード 

次の表に、上記のパラメーターを示します。

パラメーター

データ型

必須

説明

HTTP動詞

列挙

PUT

HTTPリクエストのメソッド (PUT、GET、POST、HEAD、DELETE、OPTIONSなど) 。

正規URI

String

必須

/examplebucket/exampleobject

URIエンコードされた文字列。 絶対パスでスラッシュ (/) をエンコードしないでください。

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

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

次の項目では、リクエストURIに含まれるリソースに基づいて正規URIを指定する方法について説明します。

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

    /examplebucket/exampleobjectを使用します。

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

  • 要求されたURIにオブジェクト名のみが含まれる場合、正規URIは /に設定されます。

正規クエリ文字列Canonical Query String

String

必須

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

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

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

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

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

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

Canonicalヘッダー

String

必須

hos t:cname.com
x-oss-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-oss-date:20231203T12121 2Z 

リクエストヘッダーのリストを標準形式に変換した文字列。 文字列の末尾に改行を追加します。

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

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

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

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

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

Canonicalヘッダーには、次のヘッダーを含める必要があります。

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

  • リクエスト内にある場合にCanonical headersに追加する必要があるヘッダー (先頭にx-oss-* が付いているヘッダーを含む)

追加ヘッダー

String

必須

content-length; ホスト

署名を計算するために追加するヘッダー。 すべてのヘッダーは小文字でアルファベット順に並べ替える必要があります。

ハッシュペイロード

String

必須

UNSIGNED-PAYLOAD

有効値: UNSIGNED-PAYLOAD

"GET" | "PUT" |... + "\n" +
UriEncode(<リソース>) + "\n" +
UriEncode(<QueryParam1>) + "=" + UriEncode(<Value>) + "&" + UriEncode(<QueryParam2>) + "\n" +
小文字 (<HeaderName1>) ":" + Trim(<value>) + "\n" + 小文字 (<HeaderName2>) + ":" + Trim(<value>) + "\n" + "\n"
小文字 (<AdditionalHeaderName1>) + ";" 小文字 (<AdditionalHeaderName2>) + "\n" +
未承認-ペイロード 

ステップ2: 署名する文字列の作成

次の文字列を連結して、署名する文字列を作成します。

  • Format

    "OSS4-HMAC-SHA256" + "\n" +
    タイムスタンプ + "\n" +
    スコープ + "\n" +
    Hex(SHA256Hash(<CanonicalRequest>)) 

    次の表に、上記のパラメーターを示します。

    パラメーター

    データ型

    必須

    説明

    OSS4-HMAC-SHA256

    列挙

    OSS4-HMAC-SHA25

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

    タイムスタンプ

    String

    必須

    20231203T1212Z

    UTCでの現在の時刻。 時間は、ISO 8601規格に従わなければならない。

    スコープ

    String

    必須

    20231203/cn-hangzhou/oss/aliyun_v4_request

    スコープ情報。 これにより、結果の署名が指定されたリージョンとサービスに制限されます。 形式:

    <SignDate>/<リージョン>/oss/aliyun_v4_request
    • SignDate: リクエストが開始された日付。

    • リージョン: 要求されたリソースが存在するリージョン。

    • oss: 要求されたサービスの名前。 有効値: oss。

    • aliyun_v4_request: リクエスト内の署名バージョンの説明。 有効値: aliyun_v4_request

    CanonicalRequest

    String

    必須

    PUT

    /examplebucket/exampleobject

    x-oss-additional-headers=host&x-oss-credentials=accesskeyid % 2Fcn-hangzhou % 2Foss % 2Faliyun_v4_request&x-oss-date=20231203T1212Z&x-oss-expires=86400&x-oss-signature-version=OSS4-HMAC-SHA256

    hos t:examplebucket.oss-cn-hangzhou.aliyuncs.com

    x-oss-meta-author:alice

    x-oss-meta-magic:abracadabra

    host

    UNSIGNED-PAYLOAD

    ステップ1で作成された文字列。

  • 例:

    "OSS4-HMAC-SHA256" + "\n" +
    FormatISO8601 + "\n" +
    20231203/cn-hangzhou/oss/aliyun_v4_request + "\n" +
    Hex(SHA256Hash(<CanonicalRequest>)) 

ステップ3: 署名を計算する

署名キーを取得したら、署名する文字列に対してキー付きハッシュ操作を実行して署名を計算します。 この操作のハッシュキーとして、派生した署名キーを使用します。

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

    HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("aliyun_v4" + SK, 日付)), 地域), "oss"), "aliyun_v4_request");
  2. 署名を計算します。

    HEX(HMAC-SHA256(SigningKey, StringToSign))

署名の計算例

この例では、署名付きURLが作成されます。 署名付きURLをサードパーティのユーザーと共有して、OSSにデータをアップロードできます。 次のセクションでは、URLにV4署名を含める方法を示します。

  • パラメーター

    パラメーター

    AccessKeyId

    accesskeyid

    AccessKeySecret

    accesskeysecret

    Timestamp

    20231203T1212Z

    バケット

    examplebucket

    オブジェクト

    exampleobject

    Region

    cn-hangzhou

  • PutObject

    https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject?x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=accesskeyid/20231203/cn-hangzhou/oss/aliyun_v4_request&x-oss-date=20231203T121212Z&x-oss-expires=86400&x-oss-additional-headers=host&x-oss-signature= <計算対象の署名>
    ホスト: examplebucket.oss-cn-hangzhou.aliyuncs.com
    x-oss-meta-author: alice
    x-oss-meta-magic: abracadabra 

URLにV4署名を含めるには、次の手順を実行します。

  1. 正規のリクエストを作成します。

    PUT
    /examplebucket/exampleobject
    x-oss-additional-headers=host&x-oss-credentials=accesskeyid % 2Fcn-hangzhou % 2Foss % 2Faliyun_v4_request&x-oss-date=20231203T1212Z&x-oss-expires=86400&x-oss-signature-version=OSS4-HMAC-SHA256
    hos t:examplebucket.oss-cn-hangzhou.aliyuncs.com
    x-oss-meta-author:alice
    x-oss-meta-magic:abracadabra
    
    ホスト
    未承認-ペイロード 
  2. 署名する文字列を作成します。

    OSS4-HMAC-SHA256
    20231203T1212Z
    20231203/cn-hangzhou/oss/aliyun_v4_request
    672d815902f04dd8aa90a558931f471cc7269d08a122a5e9028022d9f72333 2c 
  3. 署名を計算します。

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

      説明

      読みやすくするために、署名キーのBase64-encoded値を次の例に示します。

      WVjaYR8lCj9YC5PUS2RSZQANYbuh9DhMFxjU1NtZKfc=
    2. 署名を計算します。

      2c6c9f10d8950fb150290ef6f42570e33cd45d6a57ec7887de75fa2ec45b4c7 2
  4. URLに署名を追加します。

    https://examplebucket.oss-cn-hangzhou.aliyuncs.com?x-oss-additional-headers=host&x-oss-credential=accesskeyid % 2Fcn-hangzhou % 2Foss % 2Faliyun_v4_request&x-oss-date=20231203T1212Z&x-oss-expires=86400&x-oss-signature=バージョンOSS4-HMAC-SHA256
    ホスト: examplebucket.oss-cn-hangzhou.aliyuncs.com
    x-oss-meta-author: alice
    x-oss-meta-magic: abracadabra