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。 デフォルトでは、この要素は空のままです。
重要 |
Signature | String | AccessKeyシークレットとポリシーに基づいて計算された署名。 OSSは署名を使用してPostObjectリクエストの有効性を検証します。 詳細は、「PostObject」をご参照ください。 デフォルトでは、この要素は空のままです。 重要
|
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
署名計算プロセス
UTF-8 でエンコードされたポリシーを作成します。
署名する文字列を作成します。
ポリシーをBase64-encodeして、署名する文字列として安全に送信できる文字列を生成します。
署名を計算します。
次のメソッドに基づいてAccessKeyシークレットを使用して署名する文字列に署名します。
Signature = base64(hmac-sha1(AccessKeySecret,base64 (ポリシー)))
。
例
次のサンプルコードは、上記のポリシーを使用して、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=