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

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

最終更新日:Aug 28, 2024

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

重要

より良いセキュリティを提供するV4署名アルゴリズムを使用することを推奨します。 詳細については、「 (推奨) PostObjectリクエストにV4署名を含める」をご参照ください。

PostObjectリクエストの署名

PostObjectリクエストは、V1署名アルゴリズムをサポートします。 フォーム要素とポリシーフォームフィールドは、PostObjectリクエストの正当性とセキュリティを確保する上で重要な役割を果たします。

フォーム要素

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

要素

データ型

説明

OSSAccessKeyId

String

AccessKeyペアのAccessKey ID。

デフォルトでは、この要素は空のままです。

    重要
    • バケットアクセス制御リスト (ACL) がpublic-readまたはprivateの場合、OSSAccessKeyId要素を指定する必要があります。

    • Signature要素とポリシーフォームフィールドが存在する場合は、OSSAccessKeyId要素を指定する必要があります。

Signature

String

AccessKeyシークレットとポリシーに基づいて計算された署名。 OSSは署名を使用してPostObjectリクエストの有効性を検証します。 詳細は、「PostObject」をご参照ください。

デフォルトでは、この要素は空のままです。

重要
  • バケットACLがpublic-readまたはprivateの場合は、Signature要素を指定する必要があります。

  • OSSAccessKeyId要素とポリシーフォームフィールドが存在する場合は、Signature要素を指定する必要があります。

  • 要素のキーは大文字と小文字を区別しませんが、フォームフィールドの値は大文字と小文字を区別します。

policy

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

重要

ポリシーフォームフィールドには、有効期限と条件のパラメーターが含まれている必要があります。

{
  "expiration": "2023-12-03T13:00:00.000Z",
  "conditions": [
    {"bucket": "examplebucket"},
    ["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リクエストを2013年12月3日の13:00より前に送信する必要があることを指定します。

  • 条件

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

    パラメーター

    データ型

    必須

    説明

    マッチングモード

    バケット

    String

    いいえ

    バケットの名前です。

    バケット

    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. 署名を計算します。

    次のメソッドに基づいてAccessKeyシークレットを使用して署名する文字列に署名します。Signature = base64(hmac-sha1(AccessKeySecret,base64 (ポリシー)))

image

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

import org.apache.commons.codec.binary.Base64;

public class Demo {
    public static void main(String[] args) {
        // Before you run the sample code, make sure that the OSS_ACCESS_KEY_SECRET environment variable is configured. 
        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" +
                "    [\"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 signature. 
        String signature = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, stringToSign);
        System.out.println("signature:" + signature);
    }
}

サンプル出力:

signature:hR2cJnoG9uzrZLDAmrfOtUjtkSM=