認証情報を提供するためにHTTP Authorizationヘッダーを使用することに加えて、URLを使用してリクエストを表現する場合に、クエリ文字列パラメーターを使用してリクエストを認証できます。 これにより、アクセス資格情報を公開することなく、指定されたObject Storage Service (OSS) リソースに対する一時的なアクセス権限をユーザーに付与できます。 このトピックでは、URLにV4署名を含める方法について説明します。
OSS SDKを使用したV4シグネチャの自動実装
OSS SDKはV4シグネチャの自動実装をサポートしています。 OSS SDKを使用してリクエストを開始することを推奨します。 これにより、署名を手動で計算する必要がなくなります。 異なるプログラミング言語でOSS SDKを使用する場合にV4署名アルゴリズムを使用してリクエストに署名する方法の詳細については、OSS SDKのサンプルコードをご参照ください。 次の表に、さまざまなプログラミング言語でOSS SDKを使用する場合に、V1署名アルゴリズムを使用してリクエストに署名するために使用されるサンプルコードへの参照を示します。
SDK | 例 | サンプルコード |
Java | ||
PHP | ||
Node.js | ||
Browser.js | ||
Python | ||
Go | ||
C++ | ||
C |
URL署名
例:
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject?x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=<AccessKeyId>/20231203/cn-hangzhou/oss/aliyun_v4_request&x-oss-date=20231203T1212Z&x-oss-expires=86400&x-oss-additional-headers=host&x-oss-signature=<signature-to-be-calculated>
読みやすくするために、上記のURLの
x-oss-credential
パラメーターのフィールドはスラッシュ (/) で区切ります。 リクエストを開始すると、URLのスラッシュ(/)
をURIエンコードして% 2F
に変換します。 例:&x-oss-credential=<AccessKeyId>% 2F20231203% 2Fcn-hangzhou % 2Foss % 2Faliyun_v4_request
クエリ文字列パラメーター
パラメーター
データ型
必須
例
説明
x-oss-signature-version
String
必須
OSS4-HMAC-SHA256
署名のバージョンとアルゴリズム。 値をOSS4-HMAC-SHA256に設定します。
x-oss-credential
String
必須
LTAI ********************/20231203/cn-hangzhou/oss/aliyun_v4_request
署名の計算に使用できる資格情報。 形式:
<AccessKeyId>/<date>/<region>/oss/aliyun_v4_request
AccessKeyId: AccessKeyペアのAccessKey ID。
date: リクエストが開始された日付。
region: 要求されたリソースが存在するリージョン。
oss: 要求されたサービスの名前。 有効値: oss。
aliyun_v4_request: リクエスト内の署名バージョンの説明。 有効値: aliyun_v4_request
x-oss-date
String
必須
20231203T1212Z
URLが署名された時刻。 時間はISO 8601標準に従います。 時間差を避けるために、URLが署名されてから15分のオフセットが許可されています。
説明時間は、文字列が署名するためのタイムスタンプとして使用されます。 値は、派生署名キーの日付フィールドの値と同じでなければなりません。
x-oss-expires
Integer
可
3600
署名付きURLの有効期間。 単位は秒です。 最小値:1 最大値: 604800。
x-oss-additional-headers
String
任意
host
署名を計算するために追加するヘッダー。 リクエストに含めるすべてのリクエストヘッダーに署名することをお勧めします。
パラメータを作成するための要件を次に示します。
x-oss-additional-headersパラメーターのヘッダーはすべて小文字である必要があります。
x-oss-additional-headersパラメーターのすべてのヘッダーは、アルファベット順にソートする必要があります。
配列内のすべてのヘッダーは、文字列を取得するためにセミコロン (;) で区切られます。
x-oss-signature
String
必須
77Dv ***************
署名検証の説明。 x-oss-signatureパラメーターは署名の計算には含まれません。
x-oss-security-token
String
任意
CAIS ********************************
security token Service (STS) によって発行されたセキュリティトークン。 このパラメーターは、STSユーザーを使用してURLの署名を作成する場合にのみ必要です。
署名計算プロセス
URLの署名を計算するために使用される方法は、Authorizationヘッダーの署名を計算するために使用される方法と同様である。 次の項目は、2つの方法の違いを説明します。
ペイロードハッシュを記述する
x-oss-content-sha256
ヘッダーは、URLの署名の計算には使用されません。 署名付きURLを作成する場合、ペイロードの内容を評価することはできません。 代わりに、UNSIGNED-PAYLOADが使用されます。署名を計算するために追加するヘッダーには、Content-TypeとContent-MD5は含まれません。
署名付きURLのクエリ文字列パラメーターのキーが署名されるヘッダーと同じで、値が異なる場合、エラーが報告されます。 キーに複数の値がある場合、キーのすべての値が同時に比較されます。 値が異なる場合、エラーが報告されます。
STSから取得したアクセス資格情報を使用して署名付きURLのOSSリソースにアクセスする場合は、x-oss-security-tokenパラメーターをURLのクエリ文字列に追加する必要があります。
クエリ文字列のx-oss-signatureパラメーターは署名計算に含まれません。
ステップ1: 正規リクエストを作成する
ステップ2: 署名する文字列の作成
ステップ3: 署名を計算する
署名の計算例
この例では、署名付きURLが作成されます。 署名付きURLをサードパーティのユーザーと共有して、ユーザーがOSSにデータをアップロードできるようにすることができます。 次のセクションでは、URLにV4署名を含める方法について説明します。
パラメーター
パラメーター
例
AccessKeyId
accesskeyid
AccessKeySecret
accesskeysecret
Timestamp
20231203T1212Z
バケット
examplebucket
オブジェクト
exampleobject
Region
cn-hangzhou
PutObject
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject?x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=accesskeyid/20231203/cn-hangzhou/oss/aliyun_v4_request&x-oss-date=20231203T121212Z&x-oss-expires=86400&x-oss-additional-headers=host&x-oss-signature=<signature-to-be-calculated> Host: examplebucket.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabra
URLにV4署名を含めるには、次の手順を実行します。
正規のリクエストを作成します。
PUT /examplebucket/exampleobject x-oss-additional-headers=host&x-oss-credential=accesskeyid%2F20231203%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-date=20231203T121212Z&x-oss-expires=86400&x-oss-signature-version=OSS4-HMAC-SHA256 host:examplebucket.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author:alice x-oss-meta-magic:abracadabra host UNSIGNED-PAYLOAD
署名する文字列を作成します。
OSS4-HMAC-SHA256 20231203T121212Z 20231203/cn-hangzhou/oss/aliyun_v4_request 672d815902f04dd8aa90a558931f471cc7269d08a122a5e9028022d9f723332c
署名を計算します。
署名キーを計算します。
説明読みやすくするために、次の例では署名キーのBase64-encoded値について説明します。
WVjaYR8lCj9YC5PUS2RSZQANYbuh9DhMFxjU1NtZKfc=
署名を計算します。
2c6c9f10d8950fb150290ef6f42570e33cd45d6a57ec7887de75fa2ec45b4c72
URLに署名を追加します。
https://examplebucket.oss-cn-hangzhou.aliyuncs.com?x-oss-additional-headers=host&x-oss-credential=accesskeyid%2F20231203%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-date=20231203T121212Z&x-oss-expires=86400&x-oss-signature=2c6c9f10d8950fb150290ef6f42570e33cd45d6a57ec7887de75fa2ec45b4c72&x-oss-signature-version=OSS4-HMAC-SHA256 Host: examplebucket.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabra
署名計算の完全なサンプルコード
前述の署名計算例で提供されているパラメーターは、OSS SDK for Javaを使用した署名計算の完全なプロセスを説明するために使用されます。
import com.aliyun.oss.common.utils.BinaryUtil;
import org.apache.commons.codec.digest.DigestUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URL;
public class Demo {
/**
* Signature calculation tool
*
* @return url
*/
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 canonical request.
String canonicalRequest =
"PUT\n" +
"/examplebucket/exampleobject\n" +
"x-oss-additional-headers=host&x-oss-credential="+accesskeyid+"%2F20231203%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-date=20231203T121212Z&x-oss-expires=86400&x-oss-signature-version=OSS4-HMAC-SHA256\n" +
"host:examplebucket.oss-cn-hangzhou.aliyuncs.com\n" +
"x-oss-meta-author:alice\n" +
"x-oss-meta-magic:abracadabra\n" +
"\n" +
"host\n" +
"UNSIGNED-PAYLOAD";
// Step 2: Create a string to sign.
String stringToSign = "OSS4-HMAC-SHA256\n" +
"20231203T121212Z\n" +
"20231203/cn-hangzhou/oss/aliyun_v4_request\n" +
DigestUtils.sha256Hex(canonicalRequest);
// Step 3: Calculate the signature.
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");
byte[] result = hmacsha256(signingKey, stringToSign);
String signature = BinaryUtil.toHex(result);
System.out.println("signature:" + signature);
// Step 4: Add the signature to the URL.
String resourcePath = "exampleobject";
String endpoint = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com";
String queryString = "x-oss-additional-headers=host&" +
"x-oss-credential="+accesskeyid+"%2F20231203%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&" +
"x-oss-date=20231203T121212Z&" +
"x-oss-expires=86400&" +
"x-oss-signature=" + signature + "&" +
"x-oss-signature-version=OSS4-HMAC-SHA256";
String urlStr = endpoint + "/" + resourcePath + "?" + queryString;
URL url = new URL(urlStr);
System.out.println("url:" + url);
}
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:2c6c9f10d8950fb150290ef6f42570e33cd45d6a57ec7887de75fa2ec45b4c72
url:https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject?x-oss-additional-headers=host&x-oss-credential=accesskeyid%2F20231203%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-date=20231203T121212Z&x-oss-expires=86400&x-oss-signature=2c6c9f10d8950fb150290ef6f42570e33cd45d6a57ec7887de75fa2ec45b4c72&x-oss-signature-version=OSS4-HMAC-SHA256