Amazon Web Serviceの電子署名支援(Delphi,PHP,LazarusでのHMAC-SHA256)


概要

 2009/8ぐらいから、Amazaon Web SerivceのAPIを利用するのに、電子署名が必要になります。署名に必要なキーをプログラムに埋めて配布してする方法自体が、激しく愚かな気はしますが、Requestに電子署名しないと結果を返してくれないということらしいのでまぁ、しょーがないです。
 そこで、主に既存のリソースを持っている人が利用することを前提に、ライブラリ・・・というか関数を作成しました。なお、RESTのGET専用(SOAPは利用したこと無いので不明)。
・phpはrequire_onceで取り込んで、対象の関数を呼び出します。
・Delphi/Lazarusは対象のunitをプロジェクトに追加してusesに指定して、対象の関数を呼び出します。
・関数に、「旧来のRequestのURL」を渡すことで、「TimestampをつけてSignatureも付けたRequestのURL」が取得できます。
・キーをどうやって隠すか は考慮していません。特に、Delphi/Lazarus等で作成して、作成したプログラムを配布するような場合、キーを可逆変換して埋め込むなり、本ソースを修正して処理の流れを変えるなど、いろいろ工夫しないと、だだもれになります。

利用 〜php〜

1.awsassist.phpをrequire_onceで読み込むようにする
2.今までと同様に、REST形式のRequestの文字列をつらつらと作成する(ここの例では$urlとする)
3.Secret AccessKey IDも準備する(ここの例では$keyとする)
4.関数aa_signrequestを呼び出す。呼び出し方は、以下のような感じに。
$newurl=aa_signrequest($url,$key);
5.拾ってきたRequestでAPIをたたく(ここの例では$newurlが生成したrequest)

利用 〜Delphi/Lazarus〜

1.awsassist.pasをプロジェクトに追加する
2.awsaasistをusesに追加する
3.今までと同様に、REST形式のRequestの文字列をつらつらと作成する(ここの例ではurlとする)
3.Secret AccessKey IDも準備する(ここの例ではkeyとする)
4.関数signrequestを呼び出す。呼び出し方は、以下のような感じに。
newurl:=signrequest(url,key,nil,nil);
5.拾ってきたRequestでAPIをたたく(ここの例ではnewurlが生成したrequest)

RESTのRequestに関する共通の注意点

・新しい機能のようなので、この機能が追加されているAPIバージョンを指定しましょう。具体的には、クエリに「Version=2009-03-31」を追加。
・ユーザを識別する情報が、「SubscriptionId」から「AWSAccessKeyId」に変わっています。まだ切り替えて無い場合、切り替えましょう。

動作環境

・phpは、php4,php5で動作する予定です。4.4.7.7と5.2.8で確認。
・Lazarusは0.9.26.2で確認。動作可能なバージョン範囲は不明。
・DelphiはBorland Developer Studio 2006で確認。動作可能なバージョン範囲は不明。StringのデフォルトをUnicde(WideChar)とするバージョンはおそらくだめ。

更新

0.0.0→0.0.1 for lazarus/delphi
・パラメータの順序を間違う障害を修正(ABC..XYZabc..xyzのはずが、AaBbCc..XxYyZzの順になり、結果としてエラーとなる)

ダウンロード

関連リンク

その他でなにかへ戻る