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

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

最終更新日:Dec 20, 2024

Object Storage Service (OSS) では、Authorizationヘッダーは、認証情報を提供するために使用される最も一般的な方法です。 クエリパラメーターを使用して署名されたPOSTリクエストとリクエストを除き、すべてのOSS操作で認証にAuthorizationヘッダーが使用されます。 このトピックでは、AuthorizationヘッダーにV4署名を含める方法について説明します。

OSS SDKを使用したリクエストの自動署名

OSS SDKはV4シグネチャの自動実装をサポートしています。 OSS SDKを使用してリクエストを開始すると、手動署名が不要になります。 次の表に、さまざまなプログラミング言語の初期化コードサンプルとV4署名の実装を示します。

SDK

クライアントの初期化

署名の実装

Java

OSSClient インスタンスの設定

OSSV4Signer.java

PHP

OSSClient インスタンスの設定

SignerV4.php

Node.js

初期化

client.js

Browser.js

初期化

Python

初期化

auth.py

Go

OSSClientインスタンスの設定

v4.go

C++

初期化

SignerV4.cc

C

初期化

oss_auth.c

Authorizationヘッダーの計算

シナリオによっては、署名を手動で計算する必要がある場合があります。 たとえば、APIリクエストを開始するときは、Authorizationヘッダー値を計算する必要があります。 Authorizationヘッダーの値を計算するときは、Authorizationヘッダーの署名アルゴリズムのバージョンと署名情報をスペースで区切ります。 次の表に、Authorizationヘッダーのコンポーネントを示します。

コンポーネント

説明

署名アルゴリズム

署名の計算に使用されるアルゴリズム。 有効値: OSS4-HMAC-SHA256

署名情報

署名の計算に使用されるパラメーター。 署名情報は、キーと値のペアの形式である。 キーと値のペアをコンマ (,) で区切り、キーと値を等号 (=) で接続します。 署名情報のキーには、2つの必須フィールド (Credentialsignature) と1つのオプションフィールド (AdditionalHeaders) が含まれます。

  • 資格情報: AccessKey IDとスコープ情報。スラッシュ (/) で区切られています。

  • Signature: 計算された署名。

  • AdditionalHeaders: 署名の計算に使用されるオプションのリクエストヘッダー。 複数のヘッダーを指定する場合は、セミコロン (;) で区切ります。 ヘッダーキーは大文字と小文字を区別しないため、辞書式にソートする必要があります。

  • Format

    Authorization: "OSS4-HMAC-SHA256 Credential=" + AccessKeyId + "/" + SignDate + "/" + SignRegion + "/oss/aliyun_v4_request, " + [ "AdditionalHeaders=" + AdditionalHeadersVal + ", " ] + "Signature=" + SignatureVal
  • 例:

    Authorization: OSS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20231203/cn-hangzhou/oss/aliyun_v4_request, AdditionalHeaders=host;userdefine, Signature=4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c63fa
説明

Security Token Service (STS) から取得した一時的なアクセス資格情報を使用してリクエストを送信する場合、x-oss-security-token:security-tokenヘッダーを指定して、セキュリティトークンをリクエストヘッダーに追加する必要があります。 セキュリティトークンの取得方法の詳細については、「AssumeRole」をご参照ください。

署名計算プロセス

署名の計算は3ステップのプロセスです。

  • ステップ1: HTTPメソッドなど、必要なリクエスト要素に基づいて正規リクエストを作成します。

  • ステップ2: 正規リクエストのハッシュを作成し、正規リクエストのハッシュとOSS4-HMAC-SHA256などの必要な要素を連結して、署名する文字列を作成します。

  • ステップ3: HMAC-SHA256を使用して署名キーを作成し、HMAC-SHA256を使用して、ステップ2で作成した署名キーと署名する文字列に基づいて署名を計算します。

各ステップで必要な要素の詳細については、次のフローチャートを参照してください。 署名の計算例の詳細については、「署名の計算例」をご参照ください。

image

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

必要な要素を、OSSが署名の計算に使用する標準的な要求形式で連結します。

Canonicalリクエスト形式

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

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

説明

次の専門用語の詳細については、HTTPプロトコルを参照してください。

パラメーター

データ型

必須

説明

HTTP動詞

列挙

はい

PUT

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

正規URI

String

はい

/examplebucket/exampleobject

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

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

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

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

説明

正規URIには、バケットの説明が含まれている必要があります。 ほとんどの場合、バケットの説明はドメイン名に含まれます。

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

    /examplebucket/exampleobjectを使用します。

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

  • リクエストURIにバケット名またはオブジェクト名が含まれていない場合、正規URIは /です。

正規クエリ文字列Canonical Query String

String

はい

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

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

  • 正規クエリ文字列のパラメーターをキー名でアルファベット順に並べ替える必要があります。 ソートはエンコード後に行われます。 複数のパラメーターに同じキーがある場合は、パラメーターを元の順序で配置し、個々のパラメーターをアンパサンド (&) で区切ります。

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

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

Canonicalヘッダー

String

はい

hos t:cname.com

x-oss-content-sha256:UNSIGNED-PARYLOAD

x-oss-date:20231203T121212Z

値を持つリクエストヘッダーのリスト。

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

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

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

  • x-oss-dateヘッダーの値は、ISO 8601標準 (例: 20231203T121212Z) である必要があります。

Canonicalヘッダーは2つのタイプに分けられます。

  • 存在する必要があり、署名計算に使用されるヘッダー:

    • x-oss-content-sha256 (有効値: UNSIGNED-PARYLOAD)

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

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

    • Content-Type

    • Content-MD5

    • x-oss-*

追加ヘッダー

String

はい

content-length; ホスト

署名を計算するために追加するヘッダー (Content-Type、Content-MD5、およびx-oss-* ヘッダーを除く) 。 すべてのヘッダーキーは小文字で、アルファベット順に並べ替える必要があります。

ハッシュペイロード

String

はい

UNSIGNED-PAYLOAD

有効値: UNSIGNED-PAYLOAD

"GET" | "PUT" | ... + "\n" +
UrlEncode(<Resource>) + "\n" +
UrlEncode(<QueryParam1>) + "=" + UrlEncode(<Value>) + "&" + UrlEncode(<QueryParam2>) + "\n" +
Lowercase(<HeaderName1>) + ":" + Trim(<value>) + "\n" + Lowercase(<HeaderName2>) + ":" + Trim(<value>) + "\n" + 
Lowercase(<AdditionalHeaderName1>) + ";" + Lowercase(<AdditionalHeaderName2>) + "\n" +
UNSIGNED-PAYLOAD

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

正規リクエストのハッシュを作成し、ハッシュと他の要素を連結して、署名する文字列を作成します。

  • Format

    "OSS4-HMAC-SHA256" + "\n" +
    TimeStamp + "\n" +
    Scope + "\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

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

    <SigningDate>/<SigningRegion>/oss/aliyun_v4_request
    • SigningDate: リクエストが開始された日付。

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

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

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

    CanonicalRequest

    String

    はい

    PUT

    /examplebucket/exampleobject

    content-md5:eB5eJF1ptWaXm4bijSPyxw

    content-type:text/html

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

    x-oss-content-sha256:UNSIGNED-PAYLOAD

    x-oss-date:20231203T121212Z

    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を使用して署名キーを作成する場合、keyとMESSAGEの2つのパラメーターが必要です。

    次のコードでは、SKはAccessKeyペア、DateはISO8601形式 (例: 20231203) の現在時刻、regionは要求されたリソースが存在するリージョンです。

    DateKey = HMAC-SHA256("aliyun_v4" + SK, Date);
    DateRegionKey = HMAC-SHA256(DateKey, Region);
    DateRegionServiceKey = HMAC-SHA256(DateRegionKey, "oss");
    SigningKey = HMAC-SHA256(DateRegionServiceKey, "aliyun_v4_request");

    前の行を1行にまとめることができます。

    SigningKey = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("aliyun_v4" + SK, Date), Region), "oss"), "aliyun_v4_request");
  2. 署名キーと文字列を使用して署名を計算します。

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

署名の計算例

この例では、PutObject操作を使用して、AuthorizationヘッダーにV4署名を含める方法を説明します。

  • パラメーター

    パラメーター

    AccessKeyId

    accesskeyid

    AccessKeySecret

    accesskeysecret

    Timestamp

    20231203T1212Z

    バケット

    examplebucket

    オブジェクト

    exampleobject

    リージョン

    cn-hangzhou

  • PutObject

    PUT /exampleobject HTTP/1.1
    Content-MD5: eB5eJF1ptWaXm4bijSPyxw
    Content-Type: text/html
    Date: Sun, 03 Dec 2023 12:12:12 GMT
    Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
    Authorization: SignatureToBeCalculated
    x-oss-date: 20231203T121212Z 
    x-oss-meta-author: alice
    x-oss-meta-magic: abracadabra
    x-oss-content-sha256: UNSIGNED-PAYLOAD
  • V4署名をAuthorizationヘッダーに含めるには、次の手順を実行します。

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

      PUT
      /examplebucket/exampleobject
      
      content-md5:eB5eJF1ptWaXm4bijSPyxw
      content-type:text/html
      host:examplebucket.oss-cn-hangzhou.aliyuncs.com
      x-oss-content-sha256:UNSIGNED-PAYLOAD
      x-oss-date:20231203T121212Z
      x-oss-meta-author:alice
      x-oss-meta-magic:abracadabra
      
      host
      UNSIGNED-PAYLOAD
    2. 署名する文字列を作成します。

      OSS4-HMAC-SHA256
      20231203T121212Z
      20231203/cn-hangzhou/oss/aliyun_v4_request
      129b14df88496f434606e999e35dee010ea1cecfd3ddc378e5ed4989609c1db3
    3. 署名を計算します。

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

        HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("aliyun_v4" + "accesskeysecret", "20231203"), "cn-hangzhou"), "oss"), "aliyun_v4_request");
      2. 次の式に基づいて署名を計算します。

        説明

        署名=HEX(HMAC-SHA256(Signingkey,StringToSign))

        4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c63fa
    4. 署名をAuthorizationヘッダーに追加します。

      OSS4-HMAC-SHA256 Credential=accesskeyid/20231203/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=host,Signature=4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c63fa

  • サンプルコード

import com.aliyun.oss.common.utils.BinaryUtil;
import org.apache.commons.codec.digest.DigestUtils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;


/**
 * Signature Demo
 */
public class Demo1 {

    /**
     * Signature calculation
     *
     * @return Authorization
     */
    public static void main(String[] args) throws Exception {
        // Step 1: Construct a canonical request.
        String canonicalRequest =
                "PUT\n" +
                        "/examplebucket/exampleobject\n" +
                        "\n" +
                        "content-md5:eB5eJF1ptWaXm4bijSPyxw\n" +
                        "content-type:text/html\n" +
                        "host:examplebucket.oss-cn-hangzhou.aliyuncs.com\n" +
                        "x-oss-content-sha256:UNSIGNED-PAYLOAD\n" +
                        "x-oss-date:20231203T121212Z\n" +
                        "x-oss-meta-author:alice\n" +
                        "x-oss-meta-magic:abracadabra\n" +
                        "\n" +
                        "host\n" +
                        "UNSIGNED-PAYLOAD";

        // Step 2: Create a string to sign.
        String stringToSign = "OSS4-HMAC-SHA256\n" +
                "20231203T121212Z\n" +
                "20231203/cn-hangzhou/oss/aliyun_v4_request\n" +
                DigestUtils.sha256Hex(canonicalRequest);

        // Step 3: Calculate the signature. 
        // Set accesskeysecret to the AccessKey secret of the RAM user and date to the actual date, such as 20231203.
        byte[] dateKey = hmacsha256(("aliyun_v4" + "accesskeysecret").getBytes(), "20231203");
        // Specify the region in which the requested resource resides. Example: cn-hangzhou.
        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);

        String authorization = "OSS4-HMAC-SHA256 " +
                "Credential=accesskeyid/20231203/cn-hangzhou/oss/aliyun_v4_request," +
                "AdditionalHeaders=host," +
                "Signature=" + signature;

        System.out.println("Authorization:" + authorization);
    }

    public static byte[] hmacsha256(byte[] key, String data) {
        try {
            // Initialize the HMAC key specification, 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);
        }
    }
}