署名付き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パラメータに記載