[あすかぜ・ねっと]あすかぜ・ねっとその他Add-on SDK (Jetpack SDK) > JetpackID

JetpackID

概要

Add-on SDK 開発時には、各拡張に公開鍵暗号方式で署名をつけることが目指されていた。 これにより、例えば「拡張X v2.0.0」があったとして、 これが「拡張X v1.0.0」と同じ作者によって作られたことを保証できる。 しかし、この機能は Add-on SDK 1.x での導入は見送られた。

署名の仕組み

[概要図]

すべての拡張は ID を持っており、拡張の同一性は ID で識別される。 拡張の ID は「{41a40cb1-aa9e-47c6-a207-66b9f5875870}」のような UUID か 「inspector@mozilla.org」のようなメールアドレスに似た形式がつけられる。 Jetpack では、 「jid0-I1AF9BUoqgpQEorhKSRVp0CjA7U@jetpack」のような ID が自動生成される。 ID とは別に「RemoveTabs」「DOM Inspector」というような名前もあるが、 異なる拡張が同じ名前を持つこともあり、 1 つの拡張がロケールによって複数の名前を持つこともある。 この署名の仕組みでは、名前に関しては何も保証せず、 ID に対するコードの正当性を保証する。

各拡張は、公開鍵暗号方式によって署名される。 公開鍵暗号方式では、private-key と public-key の組み合わせが利用される。 public-key で暗号化されたものは private-key でしか復元できず、 private-key で暗号化されたものは public-key でしか復元できない。 安全な方法で public-key が周知されていれば、 その public-key で復元できる暗号は private-key の持ち主が署名したものだと保証できる。

Jetpack の場合、public-key は拡張の一部として配布される。 その場合問題となるのが、public-key 自体の改竄である。 悪意のある開発者は、新しい private-key と public-key のペアを作り、 悪意のあるコードを新しい private-key で署名して新しい public-key とともに配布できてしまう。 そこで、Jetpack では、public-key に SHA256 ハッシュをかけたものを ID として用いる。 これにより、同梱されている public-key が本当にその拡張の public-key であることを保証できる。

まとめると、

という仕組みとなっている。 なお、Add-on SDK 1.0b1 (2010/12/04 時点) ではキーと ID の生成までしか実装されておらず、 コードの署名や検証には対応していない (Bug 613618)。

既存の拡張との互換性

上記の枠組みでは ID は自動生成であり、開発者が任意に設定することができない。 そのため、Jetpack ではない通常の拡張としてすでに公開済みの拡張が Jetpack に移植できなくなっている。 この問題に対処するため、Add-on SDK 1.0b1 以降では、 package.json で id を任意に設定できるように変更された (Bug 604499)。 "jid0-" から始まる ID を除き、それ以外の任意の ID を指定できる。 ただし、任意の ID を指定した場合には、将来的にもコードの署名や検証はできないため、 セキュリティ面がやや弱くなる。

デモ

Jetpack SDK 0.4 以降では、cfx コマンドが自動的に public-key と private-key のペアを生成し、ID を自動生成する。

まず適当な package.json と lib/main.js を用意する。

D:\jetpack>bin\activate
Welcome to the Jetpack SDK. Run 'cfx docs' for assistance.

(D:\jetpack) D:\jetpack>cd packages\hoge

(D:\jetpack) D:\jetpack\packages\hoge>ls
lib  package.json

(D:\jetpack) D:\jetpack\packages\hoge>cat package.json
{
    "dependencies": ["jetpack-core"],
    "description": "Sample Jetpack",
    "author": "asukaze (http://www.asukaze.net)"
}

(D:\jetpack) D:\jetpack\packages\hoge>

package.json の書き方は cfx docs で表示されるヘルプか https://jetpack.mozillalabs.com/sdk/latest/docs/#guide/package-spec あたりを参照。

cfx run もしくは cfx xpi を実行すると、キーと ID が自動生成される。

(D:\jetpack) D:\jetpack\packages\hoge>cfx xpi
No 'id' in package.json: creating a new keypair for you.
package.json modified: please re-run 'cfx xpi'

(D:\jetpack) D:\jetpack\packages\hoge>ls
lib  package.json  package.json.backup

(D:\jetpack) D:\jetpack\packages\hoge>cat package.json
{
    "id": "jid0-LVgUwEdOR0nrIW0JwqM3ERfevaw",
    "dependencies": [
        "jetpack-core"
    ],
    "description": "Sample Jetpack",
    "author": "asukaze (http://www.asukaze.net)"
}

(D:\jetpack) D:\jetpack\packages\hoge>

private-key は ~/.jetpack/keys に保存されている。

(D:\jetpack) D:\jetpack\packages\hoge>C:

(D:\jetpack) C:\>cd "C:\Documents and Settings\asukaze\.jetpack\keys"

(D:\jetpack) C:\Documents and Settings\asukaze\.jetpack\keys>ls
jid0-LVgUwEdOR0nrIW0JwqM3ERfevaw

(D:\jetpack) C:\Documents and Settings\asukaze\.jetpack\keys>cat jid0-LVgUwE
dOR0nrIW0JwqM3ERfevaw
private-key: private-jid0-46uggohkkbuwpfgqqks4aemnmkanajq5tl5f7uzzqwgpc3x4l63a
public-key: public-jid0-p6fjscstpg3gmxdlwmvet4rs2vln6a3d66h4v5fikbmzbea3ukltcgja
vnz3lzmxafb7xlr4wupth6bvs6hqetddxpwzpzadmbogzya
jid: jid0-LVgUwEdOR0nrIW0JwqM3ERfevaw
program-id: jid0-LVgUwEdOR0nrIW0JwqM3ERfevaw@jetpack
name: hoge

(D:\jetpack) C:\Documents and Settings\asukaze\.jetpack\keys>

もう一度 cfx run や cfx xpi を実行すれば、テスト実行や XPI 生成ができる。

(D:\jetpack) C:\Documents and Settings\asukaze\.jetpack\keys>D:

(D:\jetpack) D:\jetpack\packages\hoge>cfx xpi
Exporting extension to hoge.xpi.

(D:\jetpack) D:\jetpack\packages\hoge>ls
hoge.xpi  lib  package.json  package.json.backup

(D:\jetpack) D:\jetpack\packages\hoge>

以上で、jid0-LVgUwEdOR0nrIW0JwqM3ERfevaw@jetpack という新しい拡張を作成できた。 ~/.jetpack/keys を漏洩しないように気をつければ、 この ID の拡張を作れるのは自分だけである。

更新履歴

Jetpack SDK に戻るこのページの一番上へ

Menu


Copyright (C) 2010-2012 asukaze, Some Rights Reserved.
Last Update: 2012/05/02
mail (at) asukaze.net