HTTP Authorizationヘッダを利用した署名作成およびリクエスト例#

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の値は計算されません。したがって、ユーザーが送信した値が検証なしで受け入れられます。