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

Object Storage Service:ヘッダーに V4 署名を含める (推奨)

最終更新日:Feb 15, 2026

OSS へのリクエストを開始する際は、Authorization リクエストヘッダーに V4 署名を含めてください。これにより、認証が成功します。複雑な V4 署名アルゴリズムを実装している OSS SDK を使用してリクエストを開始できます。SDK を使用できない場合にのみ、V4 署名アルゴリズムを自ら実装してください。詳細については、「このドキュメント」をご参照ください。

SDK 署名の実装

V4 署名アルゴリズムを自分で実装する場合は、まず SDK の V4 署名実装をご参照ください。

SDK

V4 署名の実装

Java

OSSV4Signer.java

Python

v4.py

Go

v4.go

JavaScript

client.js

PHP

SignerV4.php

C#

SignerV4.cs

Android

OSSV4Signer.java

Swift

SignerV4.swift

Objective-C

OSSV4Signer.m

C++

SignerV4.cc

C

oss_auth.c

Authorization リクエストヘッダー

OSS へのリクエストを開始する際は、リクエストの検証のために、Authorization リクエストヘッダーに署名を含めてください。

Authorization リクエストヘッダーのフォーマットは次のとおりです。

Authorization: OSS4-HMAC-SHA256 Credential=<AccessKeyId>/<SignDate>/<SignRegion>/oss/aliyun_v4_request, AdditionalHeaders=<AdditionalHeadersVal>, Signature=<SignatureVal>

以下の表では、Authorization リクエストヘッダーについて説明します。

コンポーネント

説明

OSS4-HMAC-SHA256

署名計算のアルゴリズムを指定します。この文字列は、OSS V4 署名バージョン (OSS4) と署名アルゴリズム (HMAC-SHA256) を定義します。V4 署名を使用して認証を行う際に、この値を指定してください。

Credential

AccessKey ID とスコープ情報 (署名計算に使用される日付、リージョン、クラウド製品を含む) です。V4 署名を使用して認証を行う際に、このフィールドを指定してください。

形式は次のとおりです。

<AccessKeyId>/<SignDate>/<SignRegion>/oss/aliyun_v4_request

ここで、

  • AccessKeyId: ご利用の AccessKey ID です。これは、リクエスターの ID を検証する一意の識別子です。

  • SignDate: 署名日付です。YYYYMMDD 形式です。

  • SignRegion: リクエストに使用されるリージョン ID(例:cn-hangzhou)。

  • oss: 固定文字列です。リクエストされたサービスが Alibaba Cloud Object Storage Service (OSS) であることを識別します。

  • aliyun_v4_request: 固定文字列です。リクエストの署名バージョンが V4 であることを指定します。

AdditionalHeaders

署名計算用のオプションのリクエストヘッダーを指定します (必須ヘッダーは指定しないでください)。小文字のヘッダー名のみを含め、辞書順にソートし、セミコロン (;) で区切ります。

例:

content-disposition;content-length

Signature

計算された署名です。V4 署名を使用して認証を行う際に、このフィールドを指定してください。

64 個の小文字の 16 進数で表される 256 ビットの署名値の例:

3938**********************************dcdc

署名計算

OSS がリクエストを受信すると、署名を計算し、Authorization リクエストヘッダー内の署名と比較します。署名が一致する場合、リクエストは成功します。それ以外の場合、リクエストは失敗します。

署名計算プロセス

次の図は、署名計算プロセスを示しています。

image

署名計算プロセスは、次の 3 つのステップで構成されます。

  1. 正規リクエストの構築: OSS 署名仕様に従ってリクエストをフォーマットし、正規リクエストを作成します。

  2. 署名文字列の構築: 正規リクエストを処理して、署名文字列を生成します。

  3. 署名の計算: AccessKey Secret に対して複数のハッシュ操作を実行して派生キーを生成します。次に、派生キーを使用して署名文字列を計算し、最終的な署名を取得します。

1. 正規リクエストの構築

正規リクエストの形式は次のとおりです。

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

正規リクエストは次のように定義されます。

パラメーター

説明

HTTP Verb

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

Canonical URI

URI エンコード済みのリソースパスです。リソースパスにはクエリ文字列は含まれません。フォワードスラッシュ(/)をエンコードしないでください。

  • リクエスト対象が OSS サービスの場合、リソースパスは / であり、URI エンコード済みリソースパスは UriEncode("/") です。

  • リクエストのターゲットがバケットの場合、リソースパスは /examplebucket/ となり、URI エンコードされたリソースパスは UriEncode("/examplebucket/") です。

  • リクエスト対象がバケット内のオブジェクトの場合、リソースパスは /examplebucket/exampleobject であり、URI エンコード済みリソースパスは UriEncode("/examplebucket/exampleobject") です。

Canonical Query String

URI エンコードされたクエリパラメーターで、辞書順にソートされます。

  • クエリパラメーターに名前と値の両方が含まれる場合、各パラメーターの名前と値をそれぞれ URI エンコードします。次に、エンコード済みの名前でパラメーターを辞書式にソートします。ソートはエンコード後に実行されることに注意してください。エンコード済みの名前と値を接続するには、= を使用します。異なるパラメーターを連結するには、& を使用します。

    • クエリパラメーター: prefix=somePrefix&marker=someMarker&max-keys=20

    • 正規クエリパラメーター:

      UriEncode("marker")+"="+UriEncode("someMarker")+"&"+UriEncode("max-keys")+"="+UriEncode("20")+"&"+UriEncode("prefix")+"="+UriEncode("somePrefix")
  • クエリパラメーターに名前のみが含まれる場合、パラメーター名を URI エンコードします。

    • クエリパラメーター: ?acl

    • 正規クエリパラメーター: UriEncode("acl")

  • クエリパラメーターが存在しない場合(リクエストURIに?が含まれていない場合)、正規化されたクエリ文字列をEmpty 文字列("")に設定します。

Canonical Headers

リクエストヘッダーのリストです。

リクエストヘッダーは次の 3 つのカテゴリに分類されます。

  • リクエストに存在し、署名計算に参加する必要があるヘッダー:

    • x-oss-content-sha256: 現在、UNSIGNED-PAYLOAD のみがサポートされています。

  • リクエストに存在する場合に署名計算に参加するヘッダー:

    • Content-Type

    • Content-MD5

    • x-oss-*: x-oss- で始まるその他のリクエストヘッダーです。たとえば、STS AccessKey を使用してアクセスする場合、SecurityToken は x-oss-security-token:security-token を使用して指定します。また、リクエスト時刻は x-oss-date を使用して指定し、そのフォーマットは ISO 8601 標準時刻フォーマットに準拠している必要があります(例: 20231203T121212Z)。

  • AdditionalHeaders で指定されたオプションのリクエストヘッダー。

形式は次のとおりです。

Lowercase(<HeaderName1>) + ":" + Trim(<value>) + "\n"
Lowercase(<HeaderName2>) + ":" + Trim(<value>) + "\n"
...
Lowercase(<HeaderNameN>) + ":" + Trim(<value>) + "\n"

例:

content-disposition:attachment
content-length:3
content-md5:ICy5YqxZB1uWSwcVLSNLcA==
content-type:text/plain
x-oss-content-sha256:UNSIGNED-PAYLOAD
x-oss-date:20250328T101048Z

Additional Headers

署名計算用のオプションのリクエストヘッダーを指定します (必須ヘッダーは指定しないでください)。小文字のヘッダー名のみを含め、辞書順にソートし、セミコロン (;) で区切ります。これは AdditionalHeaders と一致している必要があります。

例:

content-disposition;content-length

Hashed PayLoad

リクエストペイロードの SHA256 ハッシュ値の 16 進数表現です。現在、UNSIGNED-PAYLOAD のみがサポートされています。

2. 署名文字列の構築

署名文字列の形式は次のとおりです。

"OSS4-HMAC-SHA256" + "\n" +
TimeStamp + "\n" +
Scope + "\n" +
Hex(SHA256Hash(<CanonicalRequest>))

次の表は、署名文字列について説明しています。

パラメーター

説明

OSS4-HMAC-SHA256

署名ハッシュアルゴリズムです。その値は OSS4-HMAC-SHA256 である必要があります。

TimeStamp

現在の UTC 時刻です。その形式は 20250320T083322Z のような ISO8601 である必要があります。

Scope

キーを派生させるためのパラメーターセットです。このセットは、日付、リージョン、およびサービスを指定します。したがって、派生キーで計算された署名は、指定された日付、リージョン、およびサービスに対してのみ有効です。

形式は次のとおりです。

<SignDate>/<SignRegion>/oss/aliyun_v4_request

説明は次のとおりです。

  • SignDate: 署名に参加する日付です。YYYYMMDD 形式です。

  • SignRegion: 署名に使用される リージョン ID。例: cn-hangzhou

  • oss: 署名に参加するサービス名です。oss に固定されています。

  • aliyun_v4_request: 署名に参加するバージョンです。aliyun_v4_request に固定されています。

CanonicalRequest

構築された正規リクエストです。

3. 署名の計算

署名計算は、次の 2 つのステップで構成されます。

  1. SigningKey を計算します。

    DateKey = HMAC-SHA256("aliyun_v4" + SK, Date);
    DateRegionKey = HMAC-SHA256(DateKey, Region);
    DateRegionServiceKey = HMAC-SHA256(DateRegionKey, "oss");
    SigningKey = HMAC-SHA256(DateRegionServiceKey, "aliyun_v4_request");
    • SK: 署名に使用される AccessKey Secret です。

    • Date: 署名に使用される日付です。YYYYMMDD 形式です。署名文字列の SignDate と一致する必要があります。

    • Region: 署名に使用されるリージョン IDです (cn-hangzhou など)。署名対象文字列内の SignRegion と一致する必要があります。

  2. SigningKey と署名文字列を使用して Signature を計算します。

    Signature = HEX(HMAC-SHA256(SigningKey, StringToSign))

署名計算例

この例では、PutObject を使用して署名計算をデモンストレーションします。

署名計算パラメーター

パラメーター

AccessKeyId

LTAI****************

AccessKeySecret

yourAccessKeySecret

Timestamp

20250411T064124Z

Bucket

examplebucket

Object

exampleobject

Region

中国 (杭州)

署名計算プロセスの例

  1. 正規リクエストを構築します。

    PUT
    /examplebucket/exampleobject
    
    content-disposition:attachment
    content-length:3
    content-md5:ICy5YqxZB1uWSwcVLSNLcA==
    content-type:text/plain
    x-oss-content-sha256:UNSIGNED-PAYLOAD
    x-oss-date:20250411T064124Z
    
    content-disposition;content-length
    UNSIGNED-PAYLOAD
  2. 署名文字列を構築します。

    OSS4-HMAC-SHA256
    20250411T064124Z
    20250411/cn-hangzhou/oss/aliyun_v4_request
    c46d96390bdbc2d739ac9363293ae9d710b14e48081fcb22cd8ad54b63136eca
  3. 署名を計算します。

    1. SigningKey を計算します。

      説明
      • 可読性を高めるため、SigningKey は以下に 16 進数形式で示されています。

      • 署名パラメーターの組み合わせが異なると、異なる SigningKey 値が生成されます。この例は参照のみを目的としています。実際の計算結果を使用してください。

      3543b7686e65eda71e5e5ca19d548d78423c37e8ddba4dc9d83f90228b457c76
    2. Signature を計算します。

      053edbf550ebd239b32a9cdfd93b0b2b3f2d223083aa61f75e9ac16856d61f23