POST V1 署名は、クライアントが PostObject 操作を通じて Object Storage Service (OSS) に送信するアップロードリクエストを保護します。アプリケーションサーバーはアップロードポリシーから署名を計算し、その両方をクライアントに配信します。クライアントはそれらをフォームフィールドとして送信します。OSS は各 POST リクエストの署名を検証し、署名が無効なリクエストを拒否します。
OSS は、より安全な V4 署名アルゴリズムをサポートしています。(推奨) V4 署名を使用することを推奨します。詳細については、V4 署名をご参照ください。
POST V1 署名が必要な場合
OSS への HTTP POST リクエストは、このトピックで POST V1 署名と呼ぶ V1 署名アルゴリズムをサポートしています。POST V1 署名を計算する前に、以下の条件と依存関係を確認してください。
バケット ACL — 送信先バケットの ACL が公開読み取りまたは非公開の場合、PostObject リクエストには署名が必要です。
フォームフィールド —
OSSAccessKeyId、Signature、policyのフォームフィールドをグループとして指定します。フォームにこれら 3 つのフィールドのいずれかが存在する場合、他の 2 つも必須です。フィールドレベルの説明については、フォームフィールドをご参照ください。署名の計算場所 — アプリケーションサーバーが署名を計算し、アップロードポリシーとともにクライアントに配信します。クライアントはこの情報を使用して PostObject リクエストを構築します。
認証情報 — 署名は AccessKey Secret から計算されます。
OSSAccessKeyIdフォームフィールドには、同じ AccessKey ペアの AccessKey ID が含まれます。
POST V1 署名の計算
アプリケーションサーバーで、次の 3 つのステップで POST V1 署名を計算します。
ポリシーを作成します。UTF-8 エンコードされたポリシーを作成します。ポリシーの構文と宣言できる条件については、ポリシーの構造をご参照ください。
署名対象の文字列 (StringToSign) を構築します。ポリシーを Base64 エンコードします。結果の文字列が署名対象の文字列 (StringToSign) です。
署名を計算します。AccessKey Secret を使用して署名対象の文字列に署名します。署名の計算式は
Signature = base64(hmac-sha1(AccessKeySecret,base64(policy)))です。
次の図は、POST V1 署名の計算プロセスを示しています。
例:Java での POST V1 署名の計算
次の Java の例では、ポリシーの構造で説明されているポリシー例に対して、POST V1 署名の 3 つのステップを実行します。ステップ 3 では OSS Java SDK を呼び出し、署名対象の文字列に base64(hmac-sha1(AccessKeySecret,base64(policy))) の計算式を適用します。
import org.apache.commons.codec.binary.Base64;
public class Demo {
public static void main(String[] args) {
// このコード例を実行する前に、環境変数 OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
String accessKeySecret = System.getenv().get("OSS_ACCESS_KEY_SECRET");
// ステップ 1:ポリシーを作成します。
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/jpeg\", \"image/png\"]],\n" +
" [\"not-in\", \"$cache-control\", [\"no-cache\"]]\n" +
" ]\n" +
"}";
// ステップ 2:署名対象の文字列 (StringToSign) を構築します。
String stringToSign = new String(Base64.encodeBase64(policy.getBytes()));
// ステップ 3:署名を計算します。
String signature = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, stringToSign);
System.out.println("signature:" + signature);
}
}署名は次の形式で出力されます。出力される値は、ご使用の AccessKey Secret とポリシーの正確なバイト列に依存する Base64 エンコードされた文字列であるため、実際の出力は次のサンプルとは異なります。
signature:****計算された値を、OSSAccessKeyId および policy フォームフィールドとともに、PostObject リクエストの Signature フォームフィールドで送信します。
フォームフィールド
次のフォーム要素は、POST V1 署名に固有のものです。その他の一般的なフォーム要素については、PostObject フォーム要素をご参照ください。これらのフィールドが必須となる条件については、POST V1 署名が必要な場合をご参照ください。
| フィールド | タイプ | 説明 |
| OSSAccessKeyId | String | AccessKey ペアの AccessKey ID。デフォルト値:なし。 |
| Signature | String | AccessKey Secret とポリシーから計算された署名。OSS はこの署名を使用して POST リクエストの有効性を検証します。このフォームフィールドのキーは大文字と小文字を区別しませんが、値は区別します。デフォルト値:なし。OSS が POST リクエストの署名をどのように検証するかについては、PostObject をご参照ください。 |
| policy | String | アップロードの権限と制約を宣言するセキュリティポリシー。ポリシーは JSON 形式で定義され、expiration と conditions フィールドを含む必要があります。詳細については、ポリシーの構造をご参照ください。 |
ポリシーの構造
policy フォームフィールドは、HTML フォームを介して OSS にオブジェクトをアップロードするための権限と制約を定義するセキュリティポリシーです。ポリシーは JSON 形式で定義され、許可されるバケット名、オブジェクトのプレフィックス、有効期限、許可される HTTP メソッド、コンテンツサイズの制限、コンテンツタイプの制限など、複数のパラメーターを通じてアップロード操作を制限します。
次の例に示すように、ポリシーには expiration と conditions フィールドを含める必要があります。
{
"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/jpeg", "image/png"]],
["not-in", "$cache-control", ["no-cache"]]
]
}ポリシーには次の要素が含まれます。
expiration — ポリシーの有効期限を ISO 8601 GMT 形式で指定します。たとえば、
2023-12-03T13:00:00.000Zは、POST リクエストが 2023 年 12 月 3 日の 13:00 (GMT) までに開始されなければならないことを意味します。conditions — POST リクエストのフォームフィールドの有効な値を指定します。
次の表に、conditions で宣言できるフィールドを示します。
| フィールド | タイプ | 必須 | 説明 | 条件一致モード |
| bucket | String | いいえ | バケット名。 | bucket |
| content-length-range | String | いいえ | アップロードするオブジェクトの許可される最小および最大サイズ (バイト単位)。 | content-length-range |
| success_action_status | String | いいえ | アップロード成功後に返される HTTP ステータスコード。 | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
| key | String | いいえ | アップロードするオブジェクトの名前。 | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
| content-type | String | いいえ | アップロードするオブジェクトのコンテンツタイプを制限します。 | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
| cache-control | String | いいえ | オブジェクトのキャッシュ動作を指定します。 | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
条件一致モード
次の表は、POST V1 ポリシーの conditions フィールドで使用できる条件一致モードについて説明しています。
| 条件一致モード | 説明 |
| content-length-range | アップロードで許可されるオブジェクトの最小サイズと最大サイズを指定します。たとえば、1 から 10 バイトのオブジェクトサイズを許可するには、["content-length-range", 1, 10] と記述します。 |
| eq | 完全に一致するかどうかをチェックします。フォームフィールドの値は、条件で宣言された値と完全に一致する必要があります。たとえば、キーフォームフィールドの値を a にする必要がある場合は、["eq", "$key", "a"] と記述します。 |
| starts-with | プレフィックスが一致するかどうかをチェックします。フォームフィールドの値は、指定されたプレフィックスで始まる必要があります。たとえば、キーフォームフィールドの値が user/user1 で始まる必要がある場合は、["starts-with", "$key", "user/user1"] と記述します。 |
| in | 値が指定された文字列のリストに含まれているかどうかをチェックします。たとえば、PostObject 操作で画像をアップロードし、複数の画像形式を許可したい場合は、["in", "$content-type", ["image/jpeg", "image/png"]] を使用します。 |
| not-in | 値が指定された文字列のリストから除外されているかどうかをチェックします。たとえば、PostObject 操作でオブジェクトをアップロードし、キャッシュ動作に対して no-cache 値を許可したくない場合は、["not-in", "$cache-control", ["no-cache"]] を使用します。 |
| eq-ci | 大文字と小文字を区別せずに完全に一致するかどうかをチェックします。フォームフィールドの値は、条件で宣言された値と一致する必要があります。比較は小文字で行われます。たとえば、["eq-ci", "$key", "AbC"] の場合、abc、ABC、aBc などのオブジェクト名はすべて一致します。 |
| starts-with-ci | 大文字と小文字を区別せずにプレフィックスが一致するかどうかをチェックします。フォームフィールドの値は、指定されたプレフィックスで始まる必要があります。比較は小文字で行われます。たとえば、["starts-with-ci", "$key", "User/"] の場合、user/、USER/、または User/ で始まる値はすべて一致します。 |
| in-ci | 値が指定された文字列のリストに含まれているかどうかを、大文字と小文字を区別せずにチェックします。比較は小文字で行われます。たとえば、["in-ci", "$content-type", ["IMAGE/JPEG", "image/PNG"]] の場合、image/jpeg や IMAGE/PNG などの値はすべて一致します。 |
| not-in-ci | 値が指定された文字列のリストから除外されているかどうかを、大文字と小文字を区別せずにチェックします。比較は小文字で行われます。たとえば、["not-in-ci", "$cache-control", ["No-Cache"]] の場合、no-cache、NO-CACHE、No-Cache などの値はすべて除外されます。 |
ポリシーのエスケープ文字
POST ポリシーでは、ドル記号 ($) は変数を表します。リテラルのドル記号を含めるには、エスケープ文字 \$ を使用します。次の表は、ポリシー JSON でエスケープする必要がある文字を示しています。
| エスケープ文字 | 説明 |
| \/ | スラッシュ |
| \\ | バックスラッシュ |
| \" | 二重引用符 |
| \$ | ドル記号 |
| \b | スペース |
| \f | フォームフィード |
| \n | 改行 |
| \r | キャリッジリターン |
| \t | 水平タブ |
| \uxxxx | Unicode 文字 |