(1)Affelioの相互接続(AFLink)
Affelio間が相互に接続しお互いにユーザを認証するには、Affelio同士が「AFLink」というリンクで接続される必要があります。AFLinkは具体的には、2つのAffelioサイトが、暗号化の「秘密鍵」を共有する事を指します。AFLinkの生成に関するAffelioサイト間の通信は、HTTP、XML-RPCといったプロトコルの上で行われ、Diffie-Hellman鍵交換を使って「秘密鍵」を生成します。
Diffie-Hellman 鍵交換
Diffie-Hellman Key Exchangeは、公開鍵暗号方式が考案される以前の1976年に、Whitfield Diffie氏とMartin E. Hellman氏によって考案された、安全でない通信経路を使って秘密鍵を安全に送受信するための鍵交換方式です。共有鍵暗号では、データの暗号化と復号を、同一の鍵で行います。このため、データの送信者と受信者が、あらかじめその「同一の鍵」を共有しなければならず、この秘密鍵をいかに安全な手段で共有するかが問題でした。Diffie-Hellman鍵交換では、送信者と受信者は、秘密鍵そのものではなく、乱数と秘密鍵から生成した「公開情報」を送受信します。この「公開情報」は、暗号化されない通信路上を通過するため盗聴される可能性がありますが、双方が交換した一対の「公開情報」を盗聴しても、それらからだけでは、直ちに秘密鍵を算出することはできません(算出コストが非常に高い)。
DH鍵交換を図解したのが図1です。
図1
Affelio Protocolにおいては、RFC2412におけるGroup 1: 768bit素数を使っています。
g=2 p=155251809230070893513091813125848175563133404943 451431320235119490296623994910210725866945387659 164244291000768028886422915080371891804634263272 761303128298374438082089019628850917069131659317 5367469551763119843371637221007210577919
AFLink生成のためのAffelio間通信
AFLinkを生成するために、2つのAffelio間で行われる通信は、2回のHTTP通信です。Affelio(A)とAffelio(B)があり、Affelio(A)がAffelio(B)とAFLinkを生成しようとするとき、
の2回の通信が行われます。
(現在のプロトコルでは2回の別個のHTTP通信となっていますが、これは2回の通信の間にユーザによる承認作業が入ることを想定したものとなっています。今後のProtocolの拡張点として、1回のHTTP通信にプロトコルをまとめるオプションも検討されてよいと思います)
通信の概要を以下の図2に示します。この図では、ユーザA(左側)が、URL(A)にある自分のAffelioサイトを、ユーザB(右側)のAffelioサイト(URL(B))へAFLinkで接続する場合の、手順を示しています。1〜13がAFLinkを申請する通信、14以降がAFLink申請を承認する通信となります。
(図中 Affelioサイトの "WebApp?レイヤ"は、AffelioCore内のWebアプリケーション層、"Affelio/SNSレイヤ"は、lib/Affelio/SNSディレクトリ内のSNSレイヤ層を示します)
図2
AFLinkの申請(1〜13)
- 1〜2: ユーザAは、自分のAffelioサイト(URL(A))にオーナーとしてログインします。
- 3〜4: ユーザAは、自分のAffelioサイトをユーザBのAffelioサイト(URL(B))と接続させたいため、AFLinkの申請先である"URL(B)"を入力し、フォームを送信します。
- 5〜6: Affelio/SNSレイヤ、send_HandShake?()へ処理が移行し、6にて、DH鍵交換フェーズ(1)の計算を行って「公開情報」(図1におけるX)を算出します。
- 7: URL(B)/bin/xml-rpc-serv.cgiにあるXML-RPCサーバへ通信を行います(XML-RPC)。サーバ内のaffelio.HandShake?()関数を呼び出します。Affelio(A)のURL、タイムスタンプ等の情報とともに、前ステップで算出した「公開情報」をAffelio(B)へ送信します。
- 8: Affelio(B)は、ユーザBへ、AFLink申請が到着したことを通知します。
- 9〜10: Affelio(B)は、受信した情報を一時データとして保存し、Affelio(A)へ応答を返します。
- 11〜12: Affelio(A)は、Affelio(B)からの応答を受信後、DH鍵交換でさらに今後必要となる値(図1でのx)を一時データとして保存します。
- 13: Affelio(A)がブラウザへ、AFLink申請の完了を表示します。
AFLink申請の承認(14〜)
- 14: 8で自分のAffelioから通知を受けたユーザBは、Affelio(B)上の画面で申請を承認します。
- 15〜17: Affelio/SNSレイヤにおいて、9で保存した一時データを取り出し、申請の存在を確認します。また17において、DH鍵交換フェーズ(1)の計算を行い、公開情報(図1のY)を算出します。
- 18: URL(A)/bin/xml-rpc-serv.cgiにあるXML-RPCサーバへ通信を行います(XML-RPC) 。サーバ内のaffelio.HandShakeReply?()関数を呼び出します。Affelio(B)のURL、タイムスタンプ等の情報とともに、前ステップで算出した「公開情報」をAffelio(A)へ送信します。
- 19〜20: Affelio(A)では、送られてきたHandShakeReply?通信が、自サイトが以前に送出した申請に合致するかをチェックします。また12にて保存した一時データを取り出します。
- 21: Affelio(A)、Affelio(B)双方にて、DH鍵交換フェーズ(3)の計算を行い、共通の秘密鍵を算出します。
- 22: 各Affelioにて、自サイトのAFLink近隣リストに、相手のAffelioを登録します。生成した秘密鍵も保存します。
XML-RPCインターフェース
AffelioCore/技術ドキュメント/Affelio Protocol/1.0/XML-RPCインターフェースを参照してください。
Last-modified: Wed, 18 Jan 2006 23:31:49 JST (1654d)


