Object Storage Service (OSS) では、HTTP 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
権限付与: "OSS4-HMAC-SHA256 Credential=" + AccessKeyId + "/" + SignDate + "/" + SignRegion + "/oss/aliyun_v4_request, " + [ "AdditionalHeaders=" + AdditionalHeadersVal + ", " ] + "Signature=" + SignatureVal
例:
権限付与: OSS4-HMAC-SHA256資格=AKIDEXAMPLE/20231203/cn-hangzhou/oss/aliyun_v4_request, AdditionalHeaders=host;userdefine, Signature=4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c6 3fa
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
Region
cn-hangzhou
PutObject
PUT /exampleobject HTTP/1.1 Content-MD5: eB5eJF1ptWaXm4bijSPyxw コンテンツタイプ: text/html 日付: 12月3日日曜日2023 12:12:12GMT ホスト: examplebucket.oss-cn-hangzhou.aliyuncs.com 権限付与: 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 hos t: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 ホスト 未承認-ペイロード
署名する文字列を作成します。
OSS4-HMAC-SHA256 20231203T1212Z 20231203/cn-hangzhou/oss/aliyun_v4_request 129b14df88496f434606e999e35dee010ea1cecfd3ddc378e5ed4989609c1db 3
署名を計算します。
署名キーを計算します。
HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("aliyun_v4" + "accesskeysecret", "20231203T1212Z")), "cn-hangzhou"), "oss"), "aliyun_v4_request");
署名を計算します。 署名の例:
4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c6 3fa
署名をAuthorizationヘッダーに追加します。
OSS4-HMAC-SHA256 Credential=accesskeyid/20231203/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=host,Signature=4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c6 3fa
サンプルコード
impor t org.apache.com mons.codec.digest.DigestUtils; javax.crypto.Macをインポートします。javax.crypto.spec.SecretKeySpecをインポートします。java.security.InvalidKeyExceptionをインポートします。java.security.NoSuchAlgorithmExceptionをインポートします。/** * 署名デモ * / パブリッククラスDemo1 { /** * 署名の計算 * * @ return承認 */ public static void main(String[] args) throws Exception { // ステップ1: 正規リクエストを作成します。 文字列canonicalRequest= "PUT\n" + "/examplebucket/exampleobject\n" + "\n" + 「content-md5:eB5eJF1ptWaXm4bijSPyxw\n」 + "content-type:text/html\n" + "hos t:examplebucket.oss-cn-hangzhou.aliyuncs.com\n" + 「x-oss-content-sha256:UNSIGNED-PAYLOAD\n」 + "x-oss-date: 20231203T1212Z \n" + "x-oss-meta-author:alice\n" + "x-oss-meta-magic:abracadabra\n" + "additionalHeaderExample1\n" + "UNSIGNED-PAYLOAD"; // ステップ2: 署名する文字列を作成します。 String stringToSign = "OSS4-HMAC-SHA256\n" + "20231203T1212Z \n" + "20231203/cn-hangzhou/oss/aliyun_v4_request\n" + DigestUtils.sha256Hex(canonicalRequest); // ステップ3: 署名を計算します。 文字列dateKey = hmacsha256("aliyun_v4" + "accesskeysecret", "20231203T1212Z"); 文字列dateRegionKey = hmacsha256(dateKey、"cn-hangzhou"); 文字列dateRegionServiceKey = hmacsha256(dateRegionKey、"oss"); String signingKey = hmacsha256(dateRegionServiceKey, "aliyun_v4_request"); String signature = hmacsha256(signingKey, stringToSign); System.out.println("Signature:" + signature); 文字列認証="OSS4-HMAC-SHA256" + "Credential=accesskeyid/20231203/cn-hangzhou/oss/aliyun_v4_request", + "AdditionalHeaders=ホスト", + "Signature=" + signature; System.out.println("Authorization:" + authorization); } public static String hmacsha256(String data, String secret) { try { // 指定されたキーを使用してHMAC-SHA256キーを作成する SecretKeySpec secretKeySpec=新しいSecretKeySpec(secret.getBytes() 、"HmacSHA256"); // Macオブジェクトを作成する Mac mac = Mac.getInstance("HmacSHA256"); mac.init(secretKeySpec); // HMAC操作を実行します。 byte[] hmacBytes = mac.doFinal(data.getBytes()); // 結果を16進文字列に変換します。 StringBuilder sb=新しいStringBuilder(hmacBytes.length * 2); for (バイトb : hmacBytes) { sb.append(String.format("% 02x", b)); } 戻り値sb.toString(); } catch (NoSuchAlgorithmException | InvalidKeyException e) { 新しいRuntimeExceptionを投げる ("HMAC-SHA256の計算に失敗しました" 、e); } } }