Object Storage Service (OSS) では、Authorizationヘッダーは、認証情報を提供するために使用される最も一般的な方法です。 クエリパラメーターを使用して署名されたPOSTリクエストとリクエストを除き、すべてのOSS操作で認証にAuthorizationヘッダーが使用されます。 このトピックでは、AuthorizationヘッダーにV4署名を含める方法について説明します。
OSS SDKを使用したリクエストの自動署名
OSS SDKはV4シグネチャの自動実装をサポートしています。 OSS SDKを使用してリクエストを開始すると、手動署名が不要になります。 次の表に、さまざまなプログラミング言語の初期化コードサンプルとV4署名の実装を示します。
SDK | クライアントの初期化 | 署名の実装 |
Java | ||
PHP | ||
Node.js | ||
Browser.js | ||
Python | ||
Go | ||
C++ | ||
C |
Authorizationヘッダーの計算
シナリオによっては、署名を手動で計算する必要がある場合があります。 たとえば、APIリクエストを開始するときは、Authorizationヘッダー値を計算する必要があります。 Authorizationヘッダーの値を計算するときは、Authorization
ヘッダーの署名アルゴリズムのバージョンと署名情報をスペースで区切ります。 次の表に、Authorizationヘッダーのコンポーネントを示します。
コンポーネント | 説明 |
署名アルゴリズム | 署名の計算に使用されるアルゴリズム。 有効値: OSS4-HMAC-SHA256 |
署名情報 | 署名の計算に使用されるパラメーター。 署名情報は、キーと値のペアの形式である。 キーと値のペアをコンマ (,) で区切り、キーと値を等号 (=) で接続します。 署名情報のキーには、2つの必須フィールド (
|
Format
Authorization: "OSS4-HMAC-SHA256 Credential=" + AccessKeyId + "/" + SignDate + "/" + SignRegion + "/oss/aliyun_v4_request, " + [ "AdditionalHeaders=" + AdditionalHeadersVal + ", " ] + "Signature=" + SignatureVal
例:
Authorization: OSS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20231203/cn-hangzhou/oss/aliyun_v4_request, AdditionalHeaders=host;userdefine, Signature=4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c63fa
Security Token Service (STS) から取得した一時的なアクセス資格情報を使用してリクエストを送信する場合、x-oss-security-token:security-token
ヘッダーを指定して、セキュリティトークンをリクエストヘッダーに追加する必要があります。 セキュリティトークンの取得方法の詳細については、「AssumeRole」をご参照ください。
署名計算プロセス
署名の計算は3ステップのプロセスです。
ステップ1: HTTPメソッドなど、必要なリクエスト要素に基づいて正規リクエストを作成します。
ステップ2: 正規リクエストのハッシュを作成し、正規リクエストのハッシュとOSS4-HMAC-SHA256などの必要な要素を連結して、署名する文字列を作成します。
ステップ3: HMAC-SHA256を使用して署名キーを作成し、HMAC-SHA256を使用して、ステップ2で作成した署名キーと署名する文字列に基づいて署名を計算します。
各ステップで必要な要素の詳細については、次のフローチャートを参照してください。 署名の計算例の詳細については、「署名の計算例」をご参照ください。
ステップ1: 正規リクエストを作成する
ステップ2: 署名する文字列の作成
ステップ3: 署名を計算する
署名の計算例
この例では、PutObject操作を使用して、AuthorizationヘッダーにV4署名を含める方法を説明します。
パラメーター
パラメーター
例
AccessKeyId
accesskeyid
AccessKeySecret
accesskeysecret
Timestamp
20231203T1212Z
バケット
examplebucket
オブジェクト
exampleobject
リージョン
cn-hangzhou
PutObject
PUT /exampleobject HTTP/1.1 Content-MD5: eB5eJF1ptWaXm4bijSPyxw Content-Type: text/html Date: Sun, 03 Dec 2023 12:12:12 GMT Host: examplebucket.oss-cn-hangzhou.aliyuncs.com Authorization: SignatureToBeCalculated x-oss-date: 20231203T121212Z x-oss-meta-author: alice x-oss-meta-magic: abracadabra x-oss-content-sha256: UNSIGNED-PAYLOAD
V4署名をAuthorizationヘッダーに含めるには、次の手順を実行します。
正規のリクエストを作成します。
PUT /examplebucket/exampleobject content-md5:eB5eJF1ptWaXm4bijSPyxw content-type:text/html host:examplebucket.oss-cn-hangzhou.aliyuncs.com x-oss-content-sha256:UNSIGNED-PAYLOAD x-oss-date:20231203T121212Z x-oss-meta-author:alice x-oss-meta-magic:abracadabra host UNSIGNED-PAYLOAD
署名する文字列を作成します。
OSS4-HMAC-SHA256 20231203T121212Z 20231203/cn-hangzhou/oss/aliyun_v4_request 129b14df88496f434606e999e35dee010ea1cecfd3ddc378e5ed4989609c1db3
署名を計算します。
署名キーを計算します。
HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("aliyun_v4" + "accesskeysecret", "20231203"), "cn-hangzhou"), "oss"), "aliyun_v4_request");
次の式に基づいて署名を計算します。
説明署名=HEX(HMAC-SHA256(Signingkey,StringToSign))
4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c63fa
署名をAuthorizationヘッダーに追加します。
OSS4-HMAC-SHA256 Credential=accesskeyid/20231203/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=host,Signature=4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c63fa
サンプルコード
import com.aliyun.oss.common.utils.BinaryUtil;
import org.apache.commons.codec.digest.DigestUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
/**
* Signature Demo
*/
public class Demo1 {
/**
* Signature calculation
*
* @return Authorization
*/
public static void main(String[] args) throws Exception {
// Step 1: Construct a canonical request.
String canonicalRequest =
"PUT\n" +
"/examplebucket/exampleobject\n" +
"\n" +
"content-md5:eB5eJF1ptWaXm4bijSPyxw\n" +
"content-type:text/html\n" +
"host:examplebucket.oss-cn-hangzhou.aliyuncs.com\n" +
"x-oss-content-sha256:UNSIGNED-PAYLOAD\n" +
"x-oss-date:20231203T121212Z\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.
// Set accesskeysecret to the AccessKey secret of the RAM user and date to the actual date, such as 20231203.
byte[] dateKey = hmacsha256(("aliyun_v4" + "accesskeysecret").getBytes(), "20231203");
// Specify the region in which the requested resource resides. Example: cn-hangzhou.
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);
String authorization = "OSS4-HMAC-SHA256 " +
"Credential=accesskeyid/20231203/cn-hangzhou/oss/aliyun_v4_request," +
"AdditionalHeaders=host," +
"Signature=" + signature;
System.out.println("Authorization:" + authorization);
}
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);
}
}
}