リクエスト認証

本サービスへのアクセスはRESTベースのリクエストとして行なわれ、HTTPリクエストヘッダーに記述した認証ヘッダーにより正当性の検査が行なわれます。

認証ヘッダー

認証は、Authorizationヘッダーの内容により行なわれます。Authorizationヘッダーには、リクエスト内容の正当性を示すシグネチャを設定します。

シグネチャの内容

シグネチャ(Signature)の内容を以下に示します。
Authorization = "IIJGIO" + " " + IIJGIOAccessKeyId + ":" + Signature;

Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of( YourSecretAccessKey ), UTF-8-Encoding-Of( StringToSign ) ) );

StringToSign = HTTP-Verb + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;

CanonicalizedResource = [ "/" + Bucket ] +
<HTTP-Request-URI, from the protocol name up to the query string> + [ sub-resource, if present. ];

CanonicalizedHeaders = <described below>

CanonicalizedHeaders要素

CanonicalizedHeaders要素は、リクエストに含まれる全てのヘッダーのうち、x-iijgio-から始まるもの全てから生成されます。

実際の生成は以下の手順に従って行います。

  1. 全ての”x-iijgio-“または”x-amz-“で始まるヘッダーを小文字化します。
    (例:x-IIJgio-MyHeader -> x-iijgio-myheader)
  2. 全ての”x-iijgio-“または”x-amz-“で始まるヘッダーを、ヘッダー名でソートします。

  3. 複数の同名ヘッダーを1つのヘッダーとして結合します。
    (例: “x-iijgio-meta-username: fred”, “x-iijgio-meta-username: barney” -> “x-iijgio-meta-username: fred,barney”)
  4. 改行を含む連続した空白を単一の空白で置き換えます。

  5. ヘッダー内のコロン(:)に隣接するスペースを削除します。
    (例: “x-iijgio-meta-username: fred,barney” -> “x-iijgio-meta-username:fred,barney”)
  6. 結果リストの全てのヘッダーに改行(U+000A)を付加します。
    CanonicalizedResource要素の生成は、このリストに含まれる全てのヘッダー文字列として連結して行います。

CanonicalizedResource要素

CanonicalizedResource要素は、リクエストの対象となる本サービスのリソースを表します。

実際の生成は以下の手順に従って行います。

  1. 空文字列(”“)で始めます。

  2. リクエストがHTTP Hostヘッダーを用いてバケットを指定してきた場合、”/”とバケット名を付加します。
    (例: /BucketName)
  3. 復号化されていないHTTPリクエストURIのクエリストリングまで(クエリストリングは含まない)を追加します。

  4. リクエストが[ ?location, ?acl]のようなサブリソースを含む場合、名前と値を加えます。(サブリソースが1つの場合)
    サブリソースが複数の場合は辞書順に並べます。各サブリソースは”&”で区切られる必要があります。
    (例: ”?acl&versionId=value”)
    CanonicalizedResource要素の生成時に含まれるべきサブリソースのリストは以下のとおりです。
    • acl
    • location
    • partNumber
    • policy
    • uploadId
    • uploads
    • website
    • cors
    • delete
    • space
    • traffic
    GET Object で以下のパラメータをリクエストのクエリストリングに加えることで、レスポンスのヘッダを指定できます。
    • response-content-type
    • response-content-language
    • response-expires
    • response-cache-control
    • response-content-disposition
    • response-content-encoding

    これらパラメータを指定する場合、CanonicalizedResource要素にパラメータの名前とその値を加える必要があります。他のサブリソースと同様 “&” で区切ります。順番は前述のサブリソースも含めて辞書順に並べます。ここでセットする値は、URLエンコードしないでください。

StringToSign要素

StringToSignの最初のいくつかのヘッダー(Content-Type, Date, Content-MD)は固定引数です。

StringToSignへはリクエストから固定引数の値だけを加えます(ヘッダー名は含みません)。

対照的に、”x-iijgio-“要素はヘッダー名と値がStringToSignに加えられます。

リクエスト内にStringToSign要素の固定引数のヘッダーが含まれていない場合、空文字列が代入されます。

例えば、Content-Type, Content-MD5は PUTリクエストでは任意のオプションで、GETリクエストでは意味を持たないため省略した場合は空文字列となります。

リクエストのタイムスタンプ

有効なタイムスタンプ(HTTPのDateヘッダー、またはx-iijgio-date)は認証リクエストに必須です。
さらに、クライアントのタイムスタンプもリクエストに含まれなければならなりません。
また、そのタイムスタンプは本サービスのシステム時間でリクエストを受け取ってから 15分以内 でなければなりません。もしそうでない場合は、リクエストは失敗しRequestTimeTooSkewedエラーとなります。
これらは、第三者にリクエストを傍受され悪用されることを防ぐためです。より強固に傍受を防ぐには、認証後の通信にHTTPSを用いる必要があります。
いくつかのHTTPクライアントライブラリは、リクエストへ明示的にDateヘッダーをセットする事ができません。
CanonicalizedHeadersからDateヘッダーのトラブルに見舞われた際、代わりに”x-iijgio-date”ヘッダーまたは”x-amz-date”ヘッダーを用いてタイムスタンプを設定することができます。
“x-iijgio-date”ヘッダーはRFC2616のフォーマット(http://www.ietf.org/rfc/rfc2616.txt)に準拠します。
“x-iijgio-date”ヘッダーがリクエストに含まれている場合は、リクエストの署名を計算する際にDateヘッダーの要素は無視され、StringToSignのDateにはx-iijgio-dateヘッダーの要素を用います。

クエリ文字列認証

クエリ文字列認証は、上記のAuthorizationヘッダーを使用する代わりに認証するための「署名」をURLのクエリパラメータに含めて認証する方法です。

この認証方法を利用することで、ウェブブラウザなどから本サービスのストレージに格納しているリソースに直接アクセスすることができます。

署名の作成方法

以下のリクエストを例に署名を作成する方法を説明します。

GET /sample.zip
Host: mybucket.storage-dag.iijgio.com

クエリ文字列認証には以下のクエリパラメータを使用します。

パラメータ名 説明
IIJGIOAccessKeyId 認証するアカウントのアクセスキーID
Expires
署名の有効期限
Epoch TimeまたはUNIX時間(1970/01/01からの経過秒)の形式で指定します。
Signature
認証に用いる署名文字列
URLに含めるため最終的にURLエンコードした文字列となります。詳細は以下をご覽ください。
署名の作成のステップは以下の通りです。
  1. 以下に示す署名元となる文字列を作ります。

    StringToSign = HTTP-VERB + "\n" +
      Content-MD5 + "\n" +
      Content-Type + "\n" +
      Expires + "\n" +
      CanonicalizedAmzHeaders +
      CanonicalizedResource;
    

    例のリクエストの有効期限を2014年10月1日(2014-10-01T00:00:00)として作成すると以下のようになります。

    GET\n
    \n
    \n
    1412168119\n
    /mybucket/sample.zip
    
  2. 1で作成した文字列をUTF-8にエンコードし、アクセスキーIDに対応するシークレットアクセスキーを秘密鍵としてHMAC-SHA1ハッシュ値を取ります。

    SignatureRaw = HMAC-SHA1( UTF-8-Encoding-Of( YourSecretAccessKey ), UTF-8-Encoding-Of( StringToSign ) )
    
  3. 2で生成された値をBase64方式でエンコードし、その値をさらにURLエンコードします。

    Signature = URL-Encode( Base64( SignatureRaw ) );
    
    例えば、
    アクセスキーIDが EXAMPLE0000000000000
    シークレットアクセスキーが ExampleSecretAccessKey000000000000000000
    の場合は Signature は以下の文字列になります。
    37N5r3U0ZBr4Avh6B/rqZL7bftE%3D
    
  4. 作成した署名をURLに配置します。

    https://mybucket.storage-dag.iijgio.com/sample.zip?Expires=1412168119&IIJGIOAccessKeyId=EXAMPLE0000000000000&Signature=37N5r3U0ZBr4Avh6B/rqZL7bftE%3D
    

ページ先頭へ