Signature Calculation

最終更新日:2025-08-18 15:49:24

申し訳ございません、ご指摘ありがとうございます。「Note」部分については、指示通り訳出するべきでした。修正版を以下にご提示いたします。


HTTPリクエストにAuthorizationヘッダーを含めることで、署名情報を送信し、リクエスト送信者が認可されていることを示すことができます。

フォーマット説明

ヘッダー内で、署名はHTTPメッセージのauthorizationヘッダーに含まれます。Authorizationのフォーマットは以下の通りです。

Authorization:WOS-HMAC-SHA256
Credential=<AccessKeyId >/<Date>/<Region>/<Service>/wos_request,
SignedHeaders=<SignedHeader>;<SignedHeader>;<SignedHeader>,
Signature=<Signature>

注: この例の改行は読みやすさのために追加されています。実際には連続した1行で記載してください。

Authorizationパラメータの説明

パラメータ 説明
WOS-HMAC-SHA256 固定値です。署名の計算に使われるアルゴリズムです。署名アルゴリズムはHMAC-SHA256です。
Credential アクセスキーIDと、署名計算に使われた日付、リージョン、サービスを含むスコープ情報です。
この文字列は以下の形式です:
<AccessKeyId>/<Date>/<Region>/<Service>/wos_request
それぞれ:
<AccessKeyId>: シークレットキー。
<Date>: YYYYMMDD形式。
<Region>: リージョン名、例:cn-south-1。
<Service>: サービスタイプ、これは固定で ‘wos’ です。
SignedHeaders Signatureの計算に使用したリクエストヘッダー名をセミコロン区切りで並べたリスト。このリストにはヘッダー名のみ含め、すべて小文字で記載してください。例:
host;range;x-wos-date
Signature 256ビットの署名を64桁の小文字16進数で表現します。例:
0243fe336dc075f95add64c5fe980ae6fd0446b243e0f301e4ad75d32d96dc6a

署名の手順

署名の計算は通常、以下の手順で行います。
1. 正規リクエスト(Canonical Request)の作成: リクエスト内容(host、アクション、ヘッダーなど)を標準(正規)フォーマットに並べます。正規リクエストは、署名用文字列作成の入力の一つです。
2. 署名用文字列(String To Sign)の作成: 正規リクエストと、アルゴリズム、リクエスト日付、認証スコープ、正規リクエストのダイジェスト(ハッシュ)など追加情報をもとに、署名用文字列を作成します。
3. 署名(Signature)の計算: まずリクエスト日付、リージョン、サービスに対して一連のHMAC操作を行い、最初のハッシュのキーとしてシークレットアクセスキーを使用して署名鍵を導出します。

署名鍵を導出した後、その鍵で署名用文字列をHMACでハッシュし、署名を算出します。

タスク1: 正規リクエスト(Canonical Request)の作成

署名プロセスを始めるには、リクエストの情報を標準(正規)フォーマットでまとめた文字列を作成する必要があります。これにより、OSがリクエストを受信した際、双方で同じ署名計算ができます。

署名が一致するように、正規リクエストは次の形式で作成します。

<HTTPMethod> + "\n" +
<CanonicalURI> + "\n" +
<CanonicalQueryString> + "\n" +
<CanonicalHeaders> + "\n" +
<SignedHeaders> + "\n" +
<HashedPayload>

正規リクエストでは:

フィールド 説明
HTTPMethod HTTPメソッドのいずれか(例:GET、PUT、HEAD、DELETEなど)
CanonicalURI URIの絶対パスのURIエンコード版。ドメイン名の後の「/」から始まり、文字列の末尾または「?」まで。

例:http://Bucket.Endpoint/myphoto.jpg の絶対パスは /myphoto.jpg です。
CanonicalQueryString URIエンコードされたクエリ文字列のパラメータ。

1. 例: リクエストURLhttp://Bucket.Endpoint?prefix=somePrefix&marker=someMarker&max-keys=20 の場合、CanonicalQueryStringは
UriEncode("marker") + "=" + UriEncode("someMarker") + "&" + UriEncode("max-keys") + "=" + UriEncode("20") + "&" + UriEncode("prefix") + "=" + UriEncode("somePrefix")

2. サブリソースをリクエストする場合、クエリパラメータ値は空文字""。例: サブリソースaclの場合:http://Bucket.Endpoint?acl
この場合、CanonicalQueryStringは UriEncode("acl") + "=" + ""

3. URIに「?」がなければリクエストにクエリストリングはなく、canonical query stringは空文字("")。ただし「\n」は含めてください。
CanonicalHeaders リクエストヘッダーとその値のリスト。各ヘッダー名と値は「\n」で区切ります。ヘッダー名は必ず小文字で、アルファベット順に並べます。

CanonicalHeadersリストに含めるもの:
1. HTTPホストヘッダー
2. Content-Typeヘッダーがあれば含む
3. リクエストに含めるx-wos-*ヘッダーも含む

CanonicalHeadersの例:
host:bucket.endPoint,x-wos-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b785,x-wos-date:20170524T000000Z

注意事項:
1. x-wos-content-sha256は必須で、署名計算に含めます。これはリクエストペイロードのハッシュ値です。ペイロードなしの場合は空文字列のハッシュを指定します。
2. データ改ざん防止のため、すべてのリクエストヘッダーを署名計算に含めることを推奨します。
SignedHeaders アルファベット順で並んだ小文字のリクエストヘッダー名のセミコロン区切りリスト。これはCanonicalHeadersで指定したものと同じである必要があります。

例:上記CanonicalHeadersの例では、SignedHeadersは
host;x-wos-content-sha256;x-wos-date
HashedPayload リクエストペイロードのSHA256ハッシュの16進表記。リクエストにペイロードが無い場合は空文字列のハッシュを計算し、値は次のとおりです:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

例:PUTリクエストでオブジェクトをアップロードするときはオブジェクトデータをボディに含めます。GETリクエストでオブジェクトを取得する場合は空文字列のハッシュ値を使います。

タスク2: 署名用文字列(String To Sign)の作成

署名用文字列は、リクエストのメタ情報と、タスク1: 正規リクエストの作成で作成した正規リクエストについての情報を含みます。この署名用文字列と、次に導出する署名鍵を使って、リクエスト署名を計算します。

署名用文字列は、次の文字列を連結したものです:

"WOS-HMAC-SHA256" + "\n" +
TimeStamp + "\n" +
<Scope> + "\n" +
Hex(SHA256Hash(<Canonical Request>))

内容説明:

  1. WOS-HMAC-SHA256 は固定値で、使うハッシュアルゴリズム(HMAC-SHA256)を示します。
  2. TimeStamp はISO8601形式(yyyyMMdd’T’HHmmss’Z’)の現在時刻です。この値は前ステップ(例:x-wos-date)で使った値と一致させてください。
  3. Scopeは日付、サービスリージョンに有効な署名であることを示します。例:20170606/cn-east-1/wos/wos_request20170606はその日以降有効、cn-east-1はOS内のリージョン名です。
  4. Hex(SHA256Hash(<Canonical Request>)) は、タスク1: 正規リクエストの作成で作成した正規リクエストのハッシュ値(16進表記)です。この値の後に改行は不要です。

タスク3: 署名(Signature)の計算

署名の計算前に、シークレットアクセスキーから署名鍵(Signing Key)を導出する必要があります。署名鍵は日付、サービス、リージョンにスコープされるため、セキュリティが高まります。その後、タスク2で作った署名用文字列と署名鍵で署名を計算します。

1. 署名鍵の導出
署名鍵は以下の手順で計算します。各ステップの結果を次のステップの入力にします。最後のステップの結果が署名鍵です。

1. DateKey = HMAC-SHA256("WOS"+"<SecretKey>", "<Date>")
2. DateRegionKey = HMAC-SHA256(<DateKey>, "<Region>")
3. DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "wos")
4. SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "wos_request")

HMAC-SHA256(key, data)はバイナリ形式で出力するHMAC-SHA256関数です。はシークレットアクセスキー、はバケットのリージョン名です。

入力例

SigningKey = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("WOS" + "EfxET06Dvb2cahG8OBtZH9WRqkB3EXAMPLEKEY","20201103"),"cn-south-1"),"wos"),"wos_request")

この例は、2020年11月3日にcn-south-1リージョンのOSにリクエストを送る場合を示しています。

2. 署名の計算
最終的な署名は、署名鍵をキーとして、署名用文字列のHMAC-SHA256ハッシュです。計算方法は次のとおりです。

signature = HMAC-SHA256(SigningKey, StringToSign)

注: 利用するプログラミング言語ごとに、HMAC関数のパラメータ順が異なる場合があります。この例ではキーが1番目、データ(メッセージ)が2番目ですが、使う関数が異なる順序の場合もあるので注意してください。