署名情報#

バケット・オブジェクト操作コマンドにおいて、REST-APIのリクエストに署名バージョン4の署名情報を付加する必要があります。

付加の仕方には以下の2種類の方法があります。

  • HTTP Authorizationヘッダーへの付加 バケットポリシーで許可された匿名の要求を除き、すべての処理でHTTPAuthorizationヘッダーに署名を記載します。

  • クエリパラメータへの付加(署名付きURL) 署名付きURLは、クエリパラメータのURLに署名を含めることができる方法です。 本指定方法を利用するメリットとして以下があります。

    • ユーザーに期間限定で、特定のリソースへの一時的なアクセスを許可することができます。
    • シークレットアクセス キーを知らないユーザーにおいても、署名付き URLを受け取ったユーザーは、リソースにアクセスできます。

署名バージョン4の作成概要#

署名バージョン4の作成の流れを以下に示します。 

  1. リクエスト情報を含んだ正規化された文(正規リクエスト)を作成します。

    正規リクエストは次の形式です。

    "HTTP_Method "\n"Canonical_URI "\n"Canonical_Query"\n"Canonical_Headers"\n"Signed_Headers"\n"Request_payload"
    
    リクエスト項目 説明
    HTTP_Method 利用するHTTPのメソッドを記載します。(ex. GET、PUT、POST 等)
    Canonical_URI URI の絶対パス要素の URI エンコードで、クエリ文字部分を除いた文字列を記載します。
    Canonical_Query クエリ文字列に含まれる各パラメータ部分です。パラメータ名と値をそれぞれURLエンコードした文字列を”=”でつなげ、パラメータ名で辞書順にソートして”&”で結合した文字列を記載します。
    Canonical_Headers ヘッダー名と値をそれぞれ小文字に変換した文字列を":"でつなげ、パラメータ名で辞書順にソートし、改行コード(LF)を末尾に追記した文字列を記載します。
    📘ヒント:
    以下ヘッダは必須です。
    ・Hostヘッダ
    以下ヘッダはリクエスト時に使用する場合にだけ必須です。
    ・Content-Typeヘッダ
    ・x-amz-*系のヘッダ
    Signed_Headers CanonicalHeadersに含まれるパラメータのヘッダー名部分を辞書順にソートし、";"でつなげた文字列を記載します。
    Request_payload リクエストボディの値をSHA256でダイジェストで生成し16進文字列化したものです。存在しなければ空文字 ("")を入れてSHA256ダイジェストで16進化します。 
  2. 決まった形式の署名文字列を作成します。

    本文字列の中に、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進文字に変換した文字列です。 
  3. シークレットキーおよび署名文字列の情報から署名キーを作成します。

    決まった構文に対して以下のように、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 固定文字列です。
  4. 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
  1. 正規リクエスト情報

    以下の内容で、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進文字に変換した結果 \(文字列の最後に改行文字を入れないこと\)
    
  2. 署名文字列

    以下の内容で、signstring.dataファイルを作成します。

    AWS4-HMAC-SHA256
    20190322T091912Z
    20190322/jp-east-3/s3/aws4_request
    549ff4584ae198b7e53650c48040a4f645c98437dab1c2262c24621aa915af      ← 1の$REQUESTDATAの内容を記載
    
  3. 署名キーの作成

    [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     ← 署名キー
    
  4. 署名の作成

    署名文字列のファイルをsignstring.data、署名キーをSIGNKEY変数とした場合、署名は以下で作成できます。

    [user]$ SIGN4=$(openssl dgst -sha256 -mac HMAC -macopt "hexkey:${SIGNKEY}" signstring.data | awk '{print $2}')
    [user]$ echo $SIGN4
    6f309eb8c64a53cac33ff9d92bd3d2fa26a77822357bcfefe9fad5cb86e5d8c4     ← 本署名をAuthorizationパラメータに記載する。
    
📒注: 署名バージョン4は 、要求の本文のSHA256の値は計算されません。したがって、ユーザーが送信した値が検証なしで受け入れられます。

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
  1. 正規リクエスト情報

    以下の内容で、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進文字に変換した結果\(文字列の最後に改行文字を入れないこと\)
    
  2. 署名文字列

    以下の内容で、signstring.dataファイルを作成します。

    AWS4-HMAC-SHA256
    20190322T091912Z
    20190322/jp-east-3/s3/aws4_request
    549ff4584ae198b7e53650c48040a4f645c98437dab1c2262c24621aa915af      ← 1の$REQUESTDATAの内容を記載
    
  3. 署名キーの作成

    [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     ← 署名キー
    
  4. 署名の作成

    署名文字列のファイルをsignstring.data、署名キーをSIGNKEY変数とした場合、署名は以下で作成できます。

    [user]$ SIGN4=$(openssl dgst -sha256 -mac HMAC -macopt "hexkey:${SIGNKEY}" signstring.data | awk '{print $2}')
    [user]$ echo $SIGN4
    6f309eb8c64a53cac33ff9d92bd3d2fa26a77822357bcfefe9fad5cb86e5d8c4     ← 本署名をAuthorizationパラメータに記載します。
    
📒注: 署名バージョン4は 、要求の本文のSHA256の値は計算されません。したがって、ユーザーが送信した値が検証なしで受け入れられます。

署名付き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
  1. 正規リクエスト情報の作成

    以下の内容で、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進文字に変換した結果
    
  2. 署名文字列ファイルの作成

    以下の内容で、signstring.dataファイルを作成します。

    AWS4-HMAC-SHA256
    201900411T091912Z
    20190411/jp-east-3/s3/aws4_request
    466aa396f3da5d6b4ebb955d6a9c0f220d2b22d38ee6ab56e24ee38f75e70a0c   ← 1の$REQUESTDATAの内容を記載
    
  3. 署名キーの作成

    [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   ← 署名キー
    
  4. 署名の作成

    署名文字列のファイルを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パラメータに記載