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 | 必須 | 署名の計算に使用できる資格情報。 形式:
|
x-oss-date | String | 必須 | リクエストが開始された時刻。 時間は、ISO 8601規格に従わなければならない。 例:
|
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
署名計算プロセス
UTF-8 でエンコードされたポリシーを作成します。
署名する文字列を作成します。
ポリシーをBase64-encodeして、署名する文字列として安全に送信できる文字列を生成します。
署名キーを計算します。
HMAC-SHA256を使用して署名する文字列を暗号化します。 HMAC-SHA256を使用するためのキーとして、アカウントの派生キーを使用します。
署名を計算します。
HMAC-SHA256を使用して計算されたバイナリハッシュを16進文字列に変換します。 取得された16進文字列は、要求の完全性と有効性を検証するために使用される署名です。
例
次のサンプルコードは、上記のポリシーを使用して、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