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

Object Storage Service:PostObjectリクエストのV4署名

最終更新日:Oct 29, 2024

PostObjectリクエストの有効性とセキュリティを確保するには、PostObjectリクエストに署名を含める必要があります。 PostObjectリクエストのV4署名は、AccessKeyシークレット、現在の時刻、およびリージョンに基づいて、ポリシーと有効期限を含む一連のリクエストパラメーターを暗号化することによって計算されます。 アプリケーションサーバが署名を生成した後、アプリケーションサーバは、署名およびアップロードポリシーを含む情報をクライアントに返す。 クライアントは情報を使用してアップロード要求を作成します。 OSSがアップロードリクエストを受信した後、OSSは署名の有効性を検証します。 有効な署名を含むリクエストのみが許可されます。 署名検証に失敗したリクエストは拒否されます。

PostObjectリクエストの署名

データセキュリティを強化するために、PostObjectリクエストはV4署名アルゴリズムを統合します。 フォーム要素とポリシーフォームフィールドは、PostObjectリクエストの有効性とセキュリティを確保する上で重要な役割を果たします。

フォーム要素

フォームは、アップロードするオブジェクトとそのメタデータに関する情報を渡すために、PostObjectリクエストで実際に実行されるフィールドのコレクションです。 次の表に、PostObjectリクエストのV4署名の一意のフォーム要素を示します。 一般的なフォーム要素の詳細については、「フォーム要素」をご参照ください。

要素

タイプ

必須

説明

x-oss-signature-version

String

必須

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

x-oss-credential

String

必須

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

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

  • date: リクエストが開始された日付。 形式: YYYYMMDD 例: 20231203。

  • region: アクセスするバケットが配置されているAlibaba CloudリージョンのID。 例:cn-hangzhou。

  • oss: 要求されたサービスの名前。 値をossに設定します。

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

x-oss-date

String

必須

リクエストが開始された時刻。 時間は、ISO 8601規格に従わなければならない。 例: 20231203T12121 2Z

  • リクエストが開始されてから最大15分のオフセットが許可されます。 したがって、サーバーがリクエストを受信する時刻は、x-oss-dateで指定された時刻から最大15分後になることがあります。 これにより、クライアントとサーバーの間にネットワーク伝送の待ち時間や時間差が存在する場合でも、要求を期待どおりに処理できるようになります。

  • リクエストの有効期間は最大7日です。 x-oss-dateで指定された時間から7日後、OSSはリクエストを拒否し、エラーが報告されます。 これにより、リクエストの適時性とセキュリティが保証され、期限切れまたは署名されたリクエストの悪意のある送信が防止されます。

  • x-oss-dateで指定された時間は、署名する文字列のタイムスタンプとして使用されます。 値は、派生キーの日付フィールドおよびポリシーフォームフィールドのx-oss-dateフィールドの値と同じである必要があります。

x-oss-signature

String

必須

署名検証に使用される説明。 値は、HMAC-SHA256を使用してBase64-encodedポリシー文字列を暗号化し、HMAC-SHA256を使用して得られたバイナリハッシュを16進数形式に変換することによって計算されます。

policy

PostObjectリクエストのポリシーフォームフィールドは、HTMLフォームを使用してオブジェクトをアップロードするために開始するPostObjectリクエストの有効期限と条件を指定するために使用されます。 ポリシーフォームフィールドの値は、オブジェクトをアップロードするバケット名、オブジェクト名のプレフィックス、リクエストの有効期間、許可されたHTTPメソッド、オブジェクトのサイズとコンテンツなど、複数のパラメーターを指定することでPostObjectリクエストを制限するJSON文字列です。

重要

ポリシーフォームフィールドには、有効期限と条件のパラメーターが含まれている必要があります。 Conditionsパラメーターの次のフィールドには、x-oss-security-tokenパラメーターなどのオプションパラメーターが含まれています。このパラメーターは、PostObjectリクエストでセキュリティトークンを使用して署名を作成する場合にのみ必要です。 AccessKeyペアを使用してPostObjectリクエストで署名を構築する場合、x-oss-security-tokenパラメーターは不要です。

{
  "expiration": "2023-12-03T13:00:00.000Z",
  "conditions": [
    {"bucket": "examplebucket"},
    {"x-oss-signature-version": "OSS4-HMAC-SHA256"},
    {"x-oss-credential": "AKIDEXAMPLE/20231203/cn-hangzhou/oss/aliyun_v4_request"},
    {"x-oss-security-token": "CAIS******"},
    {"x-oss-date": "20231203T121212Z"},
    ["content-length-range", 1, 10],
    ["eq", "$success_action_status", "201"],
    ["starts-with", "$key", "user/eric/"],
    ["in", "$content-type", ["image/jpg", "image/png"]],
    ["not-in", "$cache-control", ["no-cache"]]
  ]
}

ポリシーフォームフィールドに必要なパラメーター

  • expiration の項目は、要求の有効期限切れ時間を ISO 8601 GMT 時間形式で指定します。

    expirationパラメーターは、リクエストの有効期限を指定します。 時間はISO 8601標準に従う必要があり、GMTである必要があります。 たとえば、2023-12-03T13:00:00.000Zは、PostObjectリクエストを2023年12月3日の13:00より前に送信する必要があることを指定します。

  • 条件

    conditionsパラメーターは、PostObjectリクエストのフォームフィールドの有効な値を指定するリストです。

    パラメーター

    タイプ

    必須

    説明

    マッチングモード

    バケット

    String

    任意

    バケットの名前です。

    バケット

    x-oss-signature-version

    String

    必須

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

    x-oss-signature-version

    x-oss-credential

    String

    必須

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

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

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

    • region: アクセスするバケットが配置されているAlibaba CloudリージョンのID。 例:cn-hangzhou。

    • oss: 要求されたサービスの名前。 値をossに設定します。

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

    x-oss-credential

    x-oss-security-token

    String

    任意

    このパラメーターは、セキュリティトークンを使用してPostObjectリクエストで署名を作成する場合にのみ必要です。 STSのAssumeRole操作を呼び出して、セキュリティトークンを取得できます。

    x-oss-security-token

    x-oss-date

    String

    必須

    リクエストが開始された時刻。 時間は、ISO 8601規格に従わなければならない。 例: 20231203T12121 2Z

    • リクエストが開始されてから最大15分のオフセットが許可されます。 したがって、サーバーがリクエストを受信する時刻は、x-oss-dateで指定された時刻から最大15分後になることがあります。 これにより、クライアントとサーバーの間にネットワーク伝送の待ち時間や時間差が存在する場合でも、要求を期待どおりに処理できるようになります。

    • リクエストの有効期間は最大7日です。 x-oss-dateで指定された時間から7日後、OSSはリクエストを拒否し、エラーが報告されます。 これにより、リクエストの適時性とセキュリティが保証され、期限切れまたは署名されたリクエストの悪意のある送信が防止されます。

    • x-oss-dateで指定された時間は、署名する文字列のタイムスタンプとして使用されます。 値は、派生キーの日付フィールドおよびポリシーフォームフィールドのx-oss-dateフィールドの値と同じである必要があります。

    x-oss-date

    content-length-range

    String

    任意

    アップロードするオブジェクトの許容最小サイズと最大サイズ。 単位はバイトです。

    content-length-range

    success_action_status

    String

    任意

    オブジェクトがアップロードされた後に返されるHTTPステータスコード。

    eq、starts-with、in、およびnot-in

    キー

    String

    任意

    アップロードするオブジェクトの名前。

    eq、starts-with、in、およびnot-in

    content-type

    String

    任意

    アップロードするオブジェクトのタイプ。

    eq、starts-with、in、およびnot-in

    cache-control

    String

    任意

    オブジェクトのキャッシュ動作。The caching behavior of the object.

    eq、starts-with、in、およびnot-in

条件マッチングモード

一致モード

説明

content-length-range

アップロードするオブジェクトのサイズは、サポートされているオブジェクトサイズの範囲内である必要があります。 たとえば、サポートされるオブジェクトサイズが1〜10バイトの場合、条件は ["content-length-range", 1, 10] でなければなりません。

eq

フォームフィールドの値は、条件で指定された値とまったく同じである必要があります。 たとえば、キーフォームフィールドの値がaでなければならない場合、条件として ["eq", "$key", "a"] を指定できます。

starts-with

フォームフィールドの値は、特定のプレフィックスで始まる必要があります。 たとえば、keyフォームフィールドの値がuser/user1で始まる場合、条件として ["starts-with", "$key", "user/user1"] を指定できます。

in

検証に含める要素。 要素は条件文字列で指定する必要があります。 たとえば、アップロードするオブジェクトのタイプが画像かどうかを確認し、PostObjectリクエストで複数の形式の画像をアップロードできるようにする場合、条件は ["in", "$content-type", ["image/jpg", "image/png"]] である必要があります。

not-in

検証から除外する要素。 要素は条件文字列で指定する必要があります。 たとえば、オブジェクトのキャッシュ動作を指定し、no-cache要素を除外する場合、条件は ["not-in", "$cache-control", ["no-cache"]] でなければなりません。

ポリシーフォームフィールドのエスケープ文字

PostObjectリクエストのポリシーフォームフィールドでは、ドル記号 ($) は変数を指定します。 ドル記号 ($) を記述するには、次のエスケープ文字を使用する必要があります: \$。 PostObjectリクエストのポリシーフォームフィールドのJSON文字列で使用されるエスケープ文字を次の表に示します。

脱出キャラクター

説明

\/

スラッシュ

\\

バックスラッシュ

\"

二重引用符

\$

ドル記号

\b

スペース

\f

フォームフィード

\n

改行

\r

キャリッジリターン

\t

水平タブ

\uxxxx

Unicode文字

署名計算プロセス

  1. UTF-8 でエンコードされたポリシーを作成します。

  2. 署名する文字列を作成します。

    ポリシーをBase64-encodeして、署名する文字列として安全に送信できる文字列を生成します。

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

    HMAC-SHA256を使用して署名する文字列を暗号化します。 HMAC-SHA256を使用するためのキーとして、アカウントの派生キーを使用します。

  4. 署名を計算します。

    HMAC-SHA256を使用して計算されたバイナリハッシュを16進文字列に変換します。 取得された16進文字列は、要求の完全性と有効性を検証するために使用される署名です。

image

次のサンプルコードは、上記のポリシーを使用して、OSS SDK for Javaを使用してPostObjectリクエストのV4署名を計算する方法の例を示しています。

import com.aliyun.oss.common.utils.BinaryUtil;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class Demo {
    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");

        // Step 1: Create a policy. 
        String policy = "{\n" +
                "  \"expiration\": \"2023-12-03T13:00:00.000Z\",\n" +
                "  \"conditions\": [\n" +
                "    {\"bucket\": \"examplebucket\"},\n" +
                "    {\"x-oss-signature-version\": \"OSS4-HMAC-SHA256\"},\n" +
                "    {\"x-oss-credential\": \""+accesskeyid+"/20231203/cn-hangzhou/oss/aliyun_v4_request\"},\n" +
                "    {\"x-oss-date\": \"20231203T121212Z\"},\n" +
                "    [\"content-length-range\", 1, 10],\n" +
                "    [\"eq\", \"$success_action_status\", \"201\"],\n" +
                "    [\"starts-with\", \"$key\", \"user/eric/\"],\n" +
                "    [\"in\", \"$content-type\", [\"image/jpg\", \"image/png\"]],\n" +
                "    [\"not-in\", \"$cache-control\", [\"no-cache\"]]\n" +
                "  ]\n" +
                "}";

        // Step 2: Create a string to sign. 
        String stringToSign = new String(Base64.encodeBase64(policy.getBytes()));

        // Step 3: Calculate the derived keys. 
        byte[] dateKey = hmacsha256(("aliyun_v4" + accesskeysecret).getBytes(), "20231203");
        byte[] dateRegionKey = hmacsha256(dateKey, "cn-hangzhou");
        byte[] dateRegionServiceKey = hmacsha256(dateRegionKey, "oss");
        byte[] signingKey = hmacsha256(dateRegionServiceKey, "aliyun_v4_request");

        // Step 4: Calculate the signature. 
        byte[] result = hmacsha256(signingKey, stringToSign);
        String signature = BinaryUtil.toHex(result);
        System.out.println("signature:" + signature);

    }

    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);
        }
    }
}

サンプル出力:

signature:1fd071f7ac52de95b2b131cd070974876c3c4fce20cce3802531bdbee13df8b1