署名情報#
バケット・オブジェクト操作コマンドにおいて、REST-APIのリクエストに署名バージョン4の署名情報を付加する必要があります。
付加の仕方には以下の2種類の方法があります。
-
HTTP Authorizationヘッダーへの付加 バケットポリシーで許可された匿名の要求を除き、すべての処理でHTTPAuthorizationヘッダーに署名を記載します。
-
クエリパラメータへの付加(署名付きURL) 署名付きURLは、クエリパラメータのURLに署名を含めることができる方法です。 本指定方法を利用するメリットとして以下があります。
- ユーザーに期間限定で、特定のリソースへの一時的なアクセスを許可することができます。
- シークレットアクセス キーを知らないユーザーにおいても、署名付き URLを受け取ったユーザーは、リソースにアクセスできます。
署名バージョン4の作成概要#
-
リクエスト情報を含んだ正規化された文(正規リクエスト)を作成します。
正規リクエストは次の形式です。
"HTTP_Method "\n"Canonical_URI "\n"Canonical_Query"\n"Canonical_Headers"\n"Signed_Headers"\n"Request_payload"
-
決まった形式の署名文字列を作成します。
本文字列の中に、step1で作成された正規リクエストをSHA256でハッシュ化し16進文字に変換した情報を含めます。
書名文字列は次の形式です。
"AWS4-HMAC-SHA256" \n ”UTC日時” \n "UTC日付/リージョンID/s3/aws4_request" \n "Canonical_str"
パラメータ 説明 AWS4-HMAC-SHA256 署名バージョン4およびHMAC-SHAR256のアルゴリズムで署名されていることの識別である固定文字列です。 UTC日時 リクエスト日時をISO8601形式のUTC日時で指定します。 ex. 20190410T011011Z 📘ヒント: x-amz-dateと同じ値を指定してください。UTC日付 リクエスト日付をISO8601形式のUTC日付で指定します。 ex. 20190410 📘ヒント: x-amz-dateの日付部分と同じ値を指定してください。リージョンID 利用リージョン (ex. jp-east-3) s3 固定文字列です。 aws4_request 固定文字列です。 Canonical_str step1で作成された正規リクエストをSHA256でハッシュ化し、16進文字に変換した文字列です。 -
シークレットキーおよび署名文字列の情報から署名キーを作成します。
決まった構文に対して以下のように、SHA256のHMAC計算を繰り返し署名キーを作成します。
HMAC_SHA256(HMAC_SHA256(HMAC_SHA256(HMAC_SHA256("AWS4"シークレットキー、UTC日付)、リージョンID),"s3"),"aws4_request")
※ HMAC_SHA256:SHAのHMAC計算を意味します。
パラメータ 説明 AWS4シークレットキー AWS4という文字に、シークレットーキーをつなげた文字列です。 📘ヒント: 例:シークレットキーがabcdefgならば、AWS4abcdefg という文字列です。UTC日付 リクエスト日付をISO8601形式のUTC日付で指定します。 📘ヒント: x-amz-dateの日付部分と同じ値を指定してください。リージョンID 利用リージョン (ex. jp-east-3)。署名文字列記載のリージョンIDを記載します。 s3 固定文字列です。 aws4_request 固定文字列です。 -
step3の署名キーを使用して、step2で作成した署名文字列に対して、SHA256のHMACを計算した結果を16進文字に変換します。
HMAC_SHA(署名キー、署名文字列)
本文字列が署名バージョン4の認証文字列です。
HTTP Authorizationヘッダを利用した署名作成およびリクエスト例1#
test.dataオブジェクトをtest-bucketバケットにPUTする例を記載します。
[user]$ curl -v -X PUT "https://objectstorage-s.jp-east-3.cloud.global.fujitsu.com/test-bucket/test.data" \ -H "x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" \ -H "x-amz-date:20190322T091912Z" \ -H "Authorization:AWS4-HMAC-SHA256 Credential=<アクセスキー>/20190322/jp-east-3/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=<"署名"> -T test.data
-
正規リクエスト情報
以下の内容で、request.dataファイルを作成します。
PUT /test-bucket/test.data ← Canonical_Queryがないため改行が入る host:objectstorage-s.jp-east-3.cloud.global.fujitsu.com x-amz-content-sha256:<Request_Payload> x-amz-date:20190322T091912Z ← Canonical_Headers全体の改行が入る host;x-amz-content-sha256;x-amz-date <Request_Payload> ← 文字列の最後改行文字を入れないこと
リクエストボディが存在しない場合でも<Request_Payload> は16進文字列化したものの記載が必要です。文字列は以下のように作成できます。
[user]$ RequestPayload=`echo -n "" | openssl dgst -sha256 | awk '{print $2}'` [user]$ echo $RequestPayload e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
上記リクエスト情報が格納されているファイルをrequest.dataとした場合、署名文字に渡すCanonical_strは以下で作成できます。
[user]$ REQUESTDATA=`openssl dgst -r -sha256 request.data | awk '{print $1}'` [user]$ echo $REQUESTDATA 549ff4584ae198b7e53650c48040a4f645c98437dab1c2262c24621aa915af13 ← 正規リクエストをSHA256でハッシュ化し16進文字に変換した結果 \(文字列の最後に改行文字を入れないこと\)
-
署名文字列
以下の内容で、signstring.dataファイルを作成します。
AWS4-HMAC-SHA256 20190322T091912Z 20190322/jp-east-3/s3/aws4_request 549ff4584ae198b7e53650c48040a4f645c98437dab1c2262c24621aa915af ← 1の$REQUESTDATAの内容を記載
-
署名キーの作成
[user]$ SECRETKEY=<シークレットキー> [user]$ LDATE="20190322" \[user\]$ REGION="jp-east-3" [user]$ SERVICE="s3" [user]$ TCODE1=$(echo -n "${LDATE}" | openssl dgst -sha256 -mac HMAC -macopt "key:AWS4${SECRETKEY}" | awk '{print $2}') [user]$ TCODE2=$(echo -n "${REGION}" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:${TCODE1}" | awk '{print $2}') [user]$ TCODE3=$(echo -n "s3" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:${TCODE2}" | awk '{print $2}') [user]$ SIGNKEY=$(echo -n "aws4_request" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:${TCODE3}" | awk '{print $2}') [user]$ echo $SIGNKEY fe8a05619a205ec5e7c0bd617f6cd71eb4c0a802ee669b62161a86ece2ad38a3 ← 署名キー
-
署名の作成
署名文字列のファイルをsignstring.data、署名キーをSIGNKEY変数とした場合、署名は以下で作成できます。
[user]$ SIGN4=$(openssl dgst -sha256 -mac HMAC -macopt "hexkey:${SIGNKEY}" signstring.data | awk '{print $2}') [user]$ echo $SIGN4 6f309eb8c64a53cac33ff9d92bd3d2fa26a77822357bcfefe9fad5cb86e5d8c4 ← 本署名をAuthorizationパラメータに記載する。
HTTP Authorizationヘッダを利用した署名作成およびリクエスト例2#
test-bucketバケットにtest.dataという名前のオブジェクトでマルチパートアップロードを開始する例を記載します。
[user]$ curl -v -X POST "https://objectstorage-s.jp-east-3.cloud.global.fujitsu.com/test-bucket/test.data?uploads" \ -H "x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" \ -H "x-amz-date:20190322T091912Z" \ -H "Authorization:AWS4-HMAC-SHA256 Credential=<アクセスキー>/20190322/jp-east-3/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=<"署名"> -T test.data
-
正規リクエスト情報
以下の内容で、request.dataファイルを作成します。
POST /test-bucket/test.data uploads= ← Canonical_Queryを"="付きで指定します host:objectstorage-s.jp-east-3.cloud.global.fujitsu.com x-amz-content-sha256:<Request_Payload> x-amz-date:20190322T091912Z ← Canonical_Headers全体の改行が入ります host;x-amz-content-sha256;x-amz-date <Request_Payload> ← 文字列の最後改行文字を入れないこと
リクエストボディが存在しない場合でも<Request_Payload> は16進文字列化したものの記載が必要です。文字列は以下のように作成できます。
[user]$ RequestPayload=`echo -n "" | openssl dgst -sha256 | awk '{print $2}'` [user]# echo $RequestPayload e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
上記リクエスト情報が格納されているファイルをrequest.dataとした場合、署名文字に渡すCanonical_strは以下で作成できます。
[user]$ REQUESTDATA=`openssl dgst -r -sha256 request.data | awk '{print $1}'` [user]$ echo $REQUESTDATA 549ff4584ae198b7e53650c48040a4f645c98437dab1c2262c24621aa915af13 ← 正規リクエストをSHA256でハッシュ化し16進文字に変換した結果\(文字列の最後に改行文字を入れないこと\)
-
署名文字列
以下の内容で、signstring.dataファイルを作成します。
AWS4-HMAC-SHA256 20190322T091912Z 20190322/jp-east-3/s3/aws4_request 549ff4584ae198b7e53650c48040a4f645c98437dab1c2262c24621aa915af ← 1の$REQUESTDATAの内容を記載
-
署名キーの作成
[user]$ SECRETKEY=<シークレットキー> [user]$ LDATE="20190322" [user]$ REGION="jp-east-3" [user]$ SERVICE="s3" [user]$ TCODE1=$(echo -n "${LDATE}" | openssl dgst -sha256 -mac HMAC -macopt "key:AWS4${SECRETKEY}" | awk '{print $2}') [user]$ TCODE2=$(echo -n "${REGION}" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:${TCODE1}" | awk '{print $2}') [user]$ TCODE3=$(echo -n "s3" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:${TCODE2}" | awk '{print $2}') [user]$ SIGNKEY=$(echo -n "aws4_request" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:${TCODE3}" | awk '{print $2}') [user]$ echo $SIGNKEY fe8a05619a205ec5e7c0bd617f6cd71eb4c0a802ee669b62161a86ece2ad38a3 ← 署名キー
-
署名の作成
署名文字列のファイルをsignstring.data、署名キーをSIGNKEY変数とした場合、署名は以下で作成できます。
[user]$ SIGN4=$(openssl dgst -sha256 -mac HMAC -macopt "hexkey:${SIGNKEY}" signstring.data | awk '{print $2}') [user]$ echo $SIGN4 6f309eb8c64a53cac33ff9d92bd3d2fa26a77822357bcfefe9fad5cb86e5d8c4 ← 本署名をAuthorizationパラメータに記載します。
署名付きURL#
書名付きURLで、test.dataオブジェクトをtest-bucketバケットにPUTする例を記載します。
[user]$ curl -v -X PUT "https://objectstorage-s.jp-east-3.cloud.global.fujitsu.com/test-bucket/test.data?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=<アクセスキー>%2F20190411%2Fjp-east-3%2Fs3%2Faws4_request &X-Amz-Date=20190411T002330Z &X-Amz-Expires=100 &X-Amz-SignedHeaders=host &X-Amz-Signature=<署名> " -T test.data
表 1. 署名付きURLパラメータ
パラメータ | 説明 |
---|---|
X-Amz-Algorithm | AWS4-HMAC-SHA256を指定します。 これは、署名バージョン4およびHMAC-SHAR256のアルゴリズムで署名されていることの識別となります。 |
X-Amz-Credential | 以下の形式で指定します。<アクセスキー>/<UTC日付>/<リージョンID>/s3/aws4_request - アクセスキー:管理コマンドのアクセスキー取得コマンド発行されたアクセスキー - UTC日付:リクエスト日付(ISO8601形式のUTC日付) - リージョンID: 利用リージョン (ex. jp-east-3) 📘ヒント: - 実際に指定する場合に"/"文字列をエンコードして指定する必要があるため、下記のように"/"の代わりに%2Fと記述します。 <アクセスキー>%2F<UTC日付>%2F<リージョンID>%2Fs3%2Faws4_request - UTC日付はx-amz-dateの日付部分と同じ値を指定します。 |
X-Amz-Date | ISO8601形式のUTC日時を指定します。 |
X-Amz-Expires | 署名付きURLの有効期間を秒単位で指定します。 指定範囲は1~604800です。 📒注:本時間はリクエストを実行できる最小時間を設定してください。 |
X-Amz-SignedHeaders | 署名計算で利用したヘッダー名を記載します。 📘ヒント: 以下ヘッダは必須です。 ・Hostヘッダ 以下ヘッダはリクエスト時に使用する場合にだけ必須です。 ・Content-Typeヘッダ ・x-amz-*系のヘッダ |
X-Amz-Signature | 作成した署名文字列を記載します。上記パラメータの末尾に付加します。 |
バケット/オブジェクト操作向けの各APIのリクエストパラメータでは、以下の headerパラメータが必須と記載していますが、本署名付きURLを利用する場合は必須ではありません。
・x-amz-content-sha256
・x-amz-date
・Authorization
-
正規リクエスト情報の作成
以下の内容で、request.dataファイルを作成します。
PUT /test-bucket/test.data X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=<アクセスキー>%2F20190411%2Fjp-east-3%2Fs3%2Faws4_request&X-Amz-Date=20190411T002330Z&X-Amz-Expires=100&X-Amz-SignedHeaders=host host:objectstorage-s.jp-east-3.cloud.global.fujitsu.com ← Canonical_Headers全体の改行 host UNSIGNED-PAYLOAD ← 署名付きURLの場合、固定文字列「UNSIGNED-PAYLOAD」を記載。改行はなし
上記リクエスト情報が格納されているファイルをrequest.dataとした場合、署名文字に渡すCanonical_strは以下で作成できます。
[user]$ REQUESTDATA=`openssl dgst -r -sha256 request.data | awk '{print $1}'` [user]$ echo $REQUESTDATA 466aa396f3da5d6b4ebb955d6a9c0f220d2b22d38ee6ab56e24ee38f75e70a0c ← 正規リクエストをSHA256でハッシュ化し16進文字に変換した結果
-
署名文字列ファイルの作成
以下の内容で、signstring.dataファイルを作成します。
AWS4-HMAC-SHA256 201900411T091912Z 20190411/jp-east-3/s3/aws4_request 466aa396f3da5d6b4ebb955d6a9c0f220d2b22d38ee6ab56e24ee38f75e70a0c ← 1の$REQUESTDATAの内容を記載
-
署名キーの作成
[user]$ SECRETKEY=<シークレットキー> [user]$ LDATE="20190411" [user]$ REGION="jp-east-3" [user]$ TCODE1=$(echo -n "${LDATE}" | openssl dgst -sha256 -mac HMAC -macopt "key:AWS4${SECRETKEY}" | awk '{print $2}') [user]$ TCODE2=$(echo -n "${REGION}" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:${TCODE1}" | awk '{print $2}') [user]$ TCODE3=$(echo -n "s3" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:${TCODE2}" | awk '{print $2}') [user]$ SIGNKEY=$(echo -n "aws4_request" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:${TCODE3}" | awk '{print $2}') [user]$ echo $SIGNKEY 72e9a862ddbb424872f7da5c08b4bb5f11a7d6e58b5fc6a01848e918984b74af ← 署名キー
-
署名の作成
署名文字列のファイルをsignstring.data、署名キーをSIGNKEY変数とした場合、署名は以下で作成できます。
[user]$ SIGN4=$(openssl dgst -sha256 -mac HMAC -macopt "hexkey:${SIGNKEY}" signstring.data | awk '{print $2}') [user]$ echo $SIGN4 6f309eb8c64a53cac33ff9d92bd3d2fa26a77822357bcfefe9fad5cb86e5d8c4 ← 本署名をX-Amz-Signatureパラメータに記載