がんふぃーるど室長の不定期ブログ

ただいま助手と悪戦苦闘中!

目次

Blog 利用状況

ニュース


自己紹介

名前:がんふぃーるど
肩書:室長
種別:人間・男
資格一覧:
MCP 70-215 Installing, Configurating, and Administering Microsoft Windows 2000 Server
MCTS .NET Framework 2.0 - Distributed Applications
MCTS .NET Framework 2.0 - Web Applications

犬紹介


名前:なうら
肩書:助手
種別:犬・狆・メス
誕生日:2006/7/9
特技:鼻水飛ばし、甘噛、奇襲・急襲・強襲、そそう、お手、お座り、待て

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

Amazon Simple Storage Service (S3) その3 - 認証 -

SOAPの認証

AWSで認証が必要な場合、自力で署名を行う必要があります。ただ、署名と言ってもメッセージ全体をハッシュしたりするわけではなく、特定のフォーマットに従った文字列を署名(ハッシュ)することになります。結構簡単です。

AWSが提供するIDとキー

  • AccessKeyID … ユーザのID。他人に知られても別に問題はありません。
  • SecretAccessKey … アクセスする為の秘密鍵。他人に知られてはダメです。これを使用し、署名を行います。署名に関しては後ほど述べます。

S3では使用しませんが、他にもクライアント証明書が用意されています。

署名

  • TimeStamp
  • Signature

 

  • Timestamp

Timestampです。時間はユニバーサル時間(グリニッジ標準時間)で記述する必要があり、フォーマットは2005-01-31T23:59:59.183Zの様にします。このTimestampの時間とAWSのサーバの時間が15分以上ずれると失敗となるので注意しましょう。

  • Signature

署名です。署名は"AmazonS3" + OPERATION(メソッド名) + Timestampのハッシュ値を取ります。ハッシュの計算はHMAC-SHA1で行います。文字エンコーディングの話が出ていないのですが、ASCII文字以外出てきそうにないので、UTF-16とかを指定しない限り大丈夫そうです…サンプルではUTF-8を使用していました。

注:DateTimeの精度についてですが、S3のサービスに合わせてミリ秒までの精度にする方が良いです。クライアント内部にキャッシュしているデータと比較したりする場合便利です。

コードサンプル(ResourceCenterにあるC#サンプルからの抜粋)

// TimeStampのフォーマットとSignatureの計算に使用するデータのプリフィックス。

private const string c_sISODateFormat = "yyyy-MM-ddTHH:mm:ss.fffZ";

private const string c_sAmazonS3 = "AmazonS3";

// Timestamp用のDateTimeを取得

public DateTime Aws_GetDatestamp()

{

  DateTime dteCurrentDateTime;

  DateTime dteFriendlyDateTime;

  dteCurrentDateTime = DateTime.Now;

  dteFriendlyDateTime = new DateTime(dteCurrentDateTime.Year,

    dteCurrentDateTime.Month, dteCurrentDateTime.Day,

    dteCurrentDateTime.Hour, dteCurrentDateTime.Minute,

    dteCurrentDateTime.Second,

    dteCurrentDateTime.Millisecond, DateTimeKind.Local);

  return dteFriendlyDateTime;

}

// グローバル時間(グリニッジ標準時間)に変換

public string Aws_GetISOtimeStamp(DateTime timeStamp)

{

  string sISOtimeStamp;

  sISOtimeStamp = timeStamp.ToUniversalTime().ToString(c_sISODateFormat, System.Globalization.CultureInfo.InvariantCulture);

  return sISOtimeStamp;

}

// 署名

public string Aws_GetSignature(string operation, DateTime timeStamp)

{

  string sSig_Raw;

  string sSignature;

  UTF8Encoding objUTF8Encoder;

  HMACSHA1 objHMACSHA1;

  sSig_Raw = c_sAmazonS3 + operation + Aws_GetISOtimeStamp(timeStamp);

  objUTF8Encoder = new UTF8Encoding();

  objHMACSHA1 = new HMACSHA1(objUTF8Encoder.GetBytes(m_sSecretAccessKey));

  sSignature = Convert.ToBase64String(objHMACSHA1.ComputeHash(objUTF8Encoder.GetBytes(sSig_Raw.ToCharArray())));

  return sSignature;

}

ちなみに、認証付きのSOAPでS3にアクセスする場合、必ずSSLでアクセスしなければなりません。

投稿日時 : 2007年2月21日 2:00

コメントを追加

No comments posted yet.
タイトル  
名前  
URL
コメント