Pastalablog in はてな

時代はブログ! 日記もあるよ→http://pastak-diary.hatenadiary.com

【追記2015/03/23】Add-on SDKで作ったFirefox拡張をHTTPで配布、アップデートする方法

<!ーー 2015/03/23追記 ーー>

Firefoxアドオンの署名に関してAMOを介して署名するという方法を取るという変更がアナウンスされているので、近日中にこの記事で紹介している方法で署名したものをインストール出来なくなることが予見されます。詳しくは より安全なアドオン体験を提供するため、拡張機能に署名を導入します | Mozilla Developer Street (modest) などMozillaや開発コミュニティから発信されている方法で確認をするようにして下さい

<!ーー 追記ここまで ――>

Firefox拡張を作る環境として、 Add-on SDKっていうのがある。
これは過去にJetpack SDKとして開発されていた環境で、数年前に触ったことがあったのだけど、最近見たらコマンドラインツールとかも含めたかなりまともな開発環境になっていて、JSで大体なんでも書けるようだったので、先日作ったChrome拡張を移植して公開することにした。
移植やAdd-on SDK開発関連の話は別の機会に書くことにして、その中でも特に大変だったFirefox拡張の公開についてメモがてら書いておきます。

Firefox拡張の公開方法

まずFirefox拡張の公開方法は大きく分けて3種類あります。

AMOで公開する

AMOはMozilla公式のアドオンホスティングサイトで、ここに登録するとバージョンアップ時に勝手にアップデートとかもしてくれるし、アドオン検索とかでも発見出来るので便利。あと、面倒なサーバの設定とかも必要ない。
ただ、Mozillaによるレビューとかがあるので、ユーザーに提供するまでに時間がかかる。

また、今回の拡張はKULASISでしか動かないので、レビューなどが通ると思わなかったので見送りました。

自前のHTTPSサーバで配布する

後述する方法でXPIインストーラとアップデートマニフェストを生成アップロードすれば、すぐにアドオンの配信と自動アップデートが提供できる。
ただ、正当なSSL証明書が必要。

この方法も正当なSSL証明書がある環境を用意出来なかったので断念。

自前のHTTPサーバで配布する

インストールマニフェストとアップデートマニフェスト電子署名を施したり色々すれば配布&自動アップデートが提供できる。

というわけで今回はこの方法でFirefox拡張を配布することにしたので、以下に手順を記しておきます。

ちなみに電子署名はMcCoyで付与するのですが、やり方はBorn Geek » Automatic Firefox Extension Updatesが詳しかったので、これを見ながらやりました。

以下のコマンド例などはkulasis-happy-backgroundで行う際のコマンドを掲載しておくので、良しなに読み替えたりしてご利用ください。

McCoyをインストールする。

McCoyはここからダウンロードできます。
McCoyはインストールマニフェストやアップデートマニフェストに署名を加えてくれるGUIツールです。

McCoyを初めて起動すると,マスターパスワードの入力を求められます。McCoy起動後,「Create」ボタンをクリックすると,「Create a New Key」ダイアログが表示されます。ここに適用な名前(例えば「test」)を入力すると,新しい公開鍵・秘密鍵のペアが生成されます(図1)。一度生成した公開鍵・秘密鍵のペアは,今後もずっと同じものを使い続ける必要があります。したがって,公開鍵・秘密鍵のペア生成の手順は,一度だけ実施すればかまいません。また,作成した公開鍵・秘密鍵のペアを,他の拡張機能に対して使いまわしても問題ありません。

via 第8回 電子署名済みアップデートマニフェストを用いた拡張機能の配布:Firefox 3ではじめる拡張機能開発|gihyo.jp … 技術評論社

XPIを生成する

cfx xpiコマンドにオプションで--update-url--update-linkを付けると自動でaddon-name.update.rdfが生成されます。
コマンドはこんな感じで叩く。

cfx xpi --update-url=https://pastalablog.s3.zmx.jp/kulasis_happy_bg/kulasis-happy-background.update.rdf --update-link=https://pastalablog.s3.zmx.jp/kulasis_happy_bg/kulasis-happy-background.xpi

これらのオプションはhttpsをURLに指定しないと、エラーが出るので、とりあえずここはhttpsで書いておくと良いです。

インストールマニフェストにキーを書き込む

XPIインストーラの実体はzipなので、適当に unzipコマンドを使って解凍する。

unzip kulasis-happy-background.xpi -d ./xpi/

これでxpiディレクトリに展開されて、その中にある xpi/install.rdfがインストールマニフェストです。
これを編集していきます。

updateURLを修正

さっきコマンドの都合でhttpsでURLを指定したので、それをhttpに変更する。

before

<em:updateURL>
https://pastalablog.s3.zmx.jp/kulasis_happy_bg/kulasis-happy-background.update.rdf
</em:updateURL>

after

<em:updateURL>
http://pastalablog.s3.zmx.jp/kulasis_happy_bg/kulasis-happy-background.update.rdf
</em:updateURL> 

updateKeyを書き込む

McCoy上でのinstallを押すとファイル選択画面が開くので、 install.rdfを選んで開くとupdateKeyが書き込まれます。

XPIに戻す

これでインストールマニフェストに書き込む作業は完了なので、XPIインストーラに戻します。 zipコマンドで圧縮すればOKです。
自分はxpiディレクトリで以下のコマンドを叩いてます。
zip -r ../kulasis-happy-background.xpi ./*

update.rdfを修正する

updateURLを修正

install.rdfと同様にさっきコマンドの都合でhttpsでURLを指定したので、それをhttpに変更する。

before

<em:updateURL>
https://pastalablog.s3.zmx.jp/kulasis_happy_bg/kulasis-happy-background.xpi
</em:updateURL>

after

<em:updateURL>
http://pastalablog.s3.zmx.jp/kulasis_happy_bg/kulasis-happy-background.xpi
</em:updateURL> 

XPIのハッシュ値を書き込む

sha1とかsha256とかでハッシュ化する。
自分はPHPでこんな感じにしてる。
php -r "echo sha1_file('./kulasis-happy-background.xpi');"

出力がb057f680cd163e2b38e05c9a479a7a1fbc4e15e0とかって出てくるので、これを*.update.rdfに書き込む。

<em:updateHash>
sha1:b057f680cd163e2b38e05c9a479a7a1fbc4e15e0
</em:updateHash>

電子署名を書き込む

McCoy上でSignを選んで、*.update.rdfを選んで開くと、アップデートマニフェストが整形されて、Signatureが書き込まれる。
次にMcCoy上でVerifyを押すと署名完了です。

サーバにアップロード

最初に指定したURLになるようにそれぞれのファイルをサーバ上に配置します。
以降、バージョンアップごとに*.update.rdfを更新することでFirefoxのアドオン自動アップデートを利用することが出来ます。