No.1329: Product Advertising APIに対応しました
月別表示: 2009年08月の記事 カテゴリー: Web Programing
2009年08月30日の日記の概要
Amazonの新しいAPIに対応するために「電子署名」の勉強をして、選挙の投票も電子化すればいいのになーとか考えている自称ニュータイプなひとの日記。
はじめに
詳しい仕様変更の内容などは別のウェブサイトで調べた方が早いかと思いますが、経緯などを感想を交えて書いておいた方が自分のためになるかと思ってこのような文章を書いている次第です。技術的なことも少しだけ書きますが、筆者は趣味で運営している者なので、参考程度に、ということで。
経緯
去る2009年8月15日より、旧称Amazon Web ServiceがProduct Advertising APIに名称変更し、一部仕様が変更されました。これにより、旧AWSの仕様に合わせて作成されている全てのRESTを利用したWeb applicationが機能しなくなりました。私のウェブサイトで運用していたCGIも例に漏れず、見事にREST requestを拒絶されて機能停止に陥っていました。
この現象に気がついたのは、先週の中頃でした。久しぶりにAmazonの商品を登録しようと思って、REST requestをAmazonのserverに投げたところ、XMLではなくてHTMLっぽい白地の反応が返ってきたことに違和感を覚えました。つまり、Amazon側が用意した3ヶ月の猶予期間中に気づかずに、実際に動かなくなってから気がついたのです。
解決しなければ行けないことは、
- 従来のRESTに電子署名を入れる
- Timestampを入れる
という2点だけ。
でも、「電子署名」って何?
ほとんどの人にとって「電子署名」という言葉は見慣れない言葉じゃないでしょうか。私の場合は、電子的な証明書のような想像は出来ますが、その実体がいったいなんなのかまでは想像できませんでした。幸いにも、大学の頃に、「暗号解読」という書籍を読んだことがあったので、公開鍵暗号の概念や仕組みは少しだけ理解していたのですが、理論を扱った読み物なので演習的なことは何一つしていませんでした。そもそも大学の授業ではなくて、趣味で読んだだけなので、身にも付いていませんでした。
電子署名についての調べ物
まずは現代の暗号技術の主流は「公開鍵暗号」という種類の暗号である、というところを確認しておく。
かつては暗号を解くための「鍵」は絶対に第三者には知られてはならないモノだったが、公開鍵暗号では送信者、受け手、傍受者つまりだれにでも閲覧可能な「公開鍵」と厳密に送信者しか知らない「秘密鍵」を利用することで暗号通信を可能にする「公開鍵暗号」が利用されている。
この技術は「電子署名」にも応用されている。
”電子文書の送信者が本当にそこに書かれている送信者なのか”、つまり”目の前の電子文書が本物の電子文書なのか”を確かめる手段として利用されているということ。
送信者は、送信したい文章(平文)に対して、「公開鍵」と「秘密鍵」を使って暗号化を施すことによって「電子署名」を作成する。(電子署名の作成)
「暗号化された文字列(電子署名)」を「平文」と一緒に送られてくると、受信者は「公開鍵」を使って「電子署名」が正しいかどうか確認する。(電子署名の評価)
ちなみに、AmazonのProduct Advertising APIで使用する「公開鍵 = Access Key 」と「秘密鍵 = Secret Key 」はAWSに登録した時点で発行されていたので、鍵の受け渡しが具体的にどのような技術で行われていたのかまでは把握していない。この辺りは暗号理論の要の部分なので、私には荷が重すぎます。詳しく知りたい人は図書館や書店で専門書を購入するなどして調べてください。(鍵の発行)
具体的には何をすればよいのか
電子署名を追加するという問題に直面している人の多くは、これまでにAWSに対してRESTでrequestを投げていた人だと思うので、まずはそのときに使用しているURLを用意する。
まずは平文を用意する。
GET(改行)
ecs.amazonaws.jp(改行)
onca/xml(改行)
ここにアルファベット順に並べ替えたRESTの内容を一行に連結して記述する(AWSAccessKeyIdとTimestampを含める)
これに対して「秘密鍵」を使って電子署名を作成します。
具体的にはHMAC-SHA256というアルゴリズムを使って計算します。
コーディングにPerlをつかうのなら、PurePerlのモジュールがあるので、お勧めです。ただしserver上に保存して使用するときに、設置する階層に注意しましょう。(私はここで詰まって、Syntax okなのにInternal server errorと出続ける現象にはまり、40分ぐらい費やしました。)
ちなみにRESTにはTimestampも含めてあるので、毎回計算する必要が出てくると思います。つまり毎回ほぼリアルタイムに処理する必要がある……。
あとは、BASE64変換とか、色々するとSignitureを作成できるので、RESTの一番最後にくっつければ新方式のREST URLの完成です。
そんな感じで半日費やして、ようやく電子署名対応型のCGIを作成することが出来ました。
まったく、こんなに知ってて当然のように「電子署名」を求められる日が来ようとは、思ってもみませんでした。
さいごに
それで、今日は第45回衆議院選挙の投票日だったじゃないですか。
ここでさんざん書いた「電子署名」を使えば、投票も電子化できますよね……。
それは直接データベースに保存される訳だから、開票も恐ろしい早さで出来るし、securityの問題を何とかすれば、かなりの予算削減になるのになーとか考えていました。
なんにせよ、民主党が圧倒的に勝ちすぎていて困る……。