Firefox 3ではじめる拡張機能開発

第8回 電子署名済みアップデートマニフェストを用いた拡張機能の配布

この記事を読むのに必要な時間:およそ 4.5 分

アップデートマニフェストへのインストーラのハッシュ値追加

次に,さきほど作成したインストーラのSHA-1ハッシュ値を算出します。SHA-1ハッシュ値の算出方法には,Windows/Linux用ソフトウェア「bkhashes⁠⁠,Firefox拡張機能「MDHashTool⁠⁠,Cygwinの「sha1sum」コマンド,PHPの「sha1_file」関数などがあります。筆者の環境にはPHPがインストールされているので,コマンドプロンプトからリスト2のようにしてSHA-1ハッシュ値を算出しています。

リスト2 PHPの「sha1_file」関数を使ったSHA-1ハッシュ値の算出

php -r "echo sha1_file('c:\\work\\taghelper\\taghelper.xpi');"

SHA-1ハッシュ値を算出したら,第7回リスト3の形式で作成したアップデートマニフェストに対して,リスト3のように<em:updateHash>sha1:{SHA-1ハッシュ値}</em:updateHash>という形式でタグを追加します。なお,後の動作確認にてアドオンマネージャに更新を検出させるため,あえて<em:version>タグの値を「0.8」ではなく「0.8.1」としています。

リスト3 アップデートマニフェストの修正(例)

<?xml version="1.0"?>

<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">

  <Description about="urn:mozilla:extension:taghelper@xuldev.org">
    <em:updates>
      <Seq>
        <li>
            <Description>
            <em:version>0.8.1</em:version>
            <em:targetApplication>
              <Description>
                <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
                <em:minVersion>3.0</em:minVersion>
                <em:maxVersion>3.0.*</em:maxVersion>
                <em:updateLink>http://www.xuldev.org/misc/sd/taghelper-0.8.xpi</em:updateLink>
                <em:updateHash>sha1:8d6769c9bca0bda73727770ba1bbaf66409263b8</em:updateHash>
              </Description>
            </em:targetApplication>
          </Description>
        </li>
      </Seq>
    </em:updates>
  </Description>

</RDF>

注意点すべき点として,SHA-1ハッシュ値は,インストーラのファイルが1バイトでも違えばまったく異なる値となりますので,インストーラを作成したらその都度ハッシュ値の追加をしなおす必要があります。

アップデートマニフェストへの電子署名

アップデートマニフェストへの電子署名を施す前に,現在の状態のアップデートマニフェストをファイル名「update.rdf.bak」などでバックアップしてください。

McCoyで生成した公開鍵・秘密鍵のペアを選択し,⁠Sign」ボタンをクリックして,先ほど作成したアップデートマニフェストのファイル「update.rdf」を選択します図3⁠。すると,アップデートマニフェストの内容がパースされ,リスト3のように電子署名を表す<em:signature>タグが追加されます。

図3 McCoyでの電子署名

図3 McCoyでの電子署名

リスト4 電子署名を施したアップデートマニフェスト(例)

<?xml version="1.0"?>
<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
         xmlns:NC="http://home.netscape.com/NC-rdf#"
         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <RDF:Description RDF:about="rdf:#$3b.rF3"
                   em:version="0.8.1">
    <em:targetApplication RDF:resource="rdf:#$6b.rF3"/>
  </RDF:Description>
  <RDF:Description RDF:about="rdf:#$6b.rF3"
                   em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
                   em:minVersion="3.0"
                   em:maxVersion="3.0.*"
                   em:updateLink="http://www.xuldev.org/misc/sd/taghelper-0.8.xpi"
                   em:updateHash="sha1:8d6769c9bca0bda73727770ba1bbaf66409263b8" />
  <RDF:Seq RDF:about="rdf:#$2b.rF3">
    <RDF:li RDF:resource="rdf:#$3b.rF3"/>
  </RDF:Seq>
  <RDF:Description RDF:about="urn:mozilla:extension:taghelper@xuldev.org"
                   em:signature="MIGTMA0GCSqGSIb3DQEBDQUAA4GBAI+e5XvP8Q/viijwVWbC30MvwM4Ohstm5hqUqfkhjmZCsWcIUaux1XPi2r+/keAN+XxTYV4oaQvcP9OSeOzEQNuxwTNUDP5iHmDfRjpEfQHNI5X4QYHmNqlcHTm2loQzQjq1fQd1vUSRdq1WP9/NELuBqpnzC6abb1+iK+WK978q">
    <em:updates RDF:resource="rdf:#$2b.rF3"/>
  </RDF:Description>
</RDF:RDF>

なお,McCoyによって電子署名が施されたアップデートマニフェストは,XMLの構造が少し複雑になります。しかし,このファイルを直接編集しないでください。アップデートマニフェストを編集する場合は,バックアップした「update.rdf.bak」からアップデートマニフェストの内容をいったん元に戻し,内容を修正後再びバックアップしてから上記手順で電子署名を施してください。

Webサーバでの公開

アップデートマニフェストとインストーラを,それぞれリスト1の<em:updateURL>で示したURL,リスト3の<em:updateLink>で示したURLでダウンロード可能となるよう,Webサーバ上に公開します。なお,Webサーバからインストーラをダウンロードする時,WebサーバはHTTPレスポンスヘッダ「Content-type: application/x-xpinstall」を返すよう設定する必要があります。詳しくは下記URLの「拡張機能 XPI の作り方」を参照してください。

Extension Packaging - MDC
URLhttp://developer.mozilla.org/ja/Extension_Packaging

動作確認

実際にアドオンマネージャにて更新確認と新しいバージョンがインストール可能であることの動作確認を行います。インストーラの動作確認用のプロファイルへタグヘルパーが既にインストールされている場合は,まず削除(アンインストール)してください。その後,以下の3点を確認してください。

  • リスト3の<em:updateLink>で示したURLをFirefoxのロケーションバー入力すると,タグヘルパー(バージョン0.8)のインストールが正常に行われる。
  • タグヘルパー(バージョン0.8)をインストール後,アドオンマネージャで「更新を確認」すると,図4のようにタグヘルパーの更新(バージョン0.8.1)が検出される。
  • アドオンマネージャにて「更新をインストール」ボタンをクリックすると,正常にインストールが実行される。

図4 タグヘルパーの更新を検出

図4 タグヘルパーの更新を検出

なお,今回は動作確認として,アップデートマニフェスト側はバージョン0.8.1,実際のインストーラはバージョン0.8としています。したがって,上記手順の自動更新後に再び「更新を確認」すると,再度タグヘルパーの更新(バージョン0.8.1)が検出されることになります。

まとめ

今回はおもにレンタルサーバなどで拡張機能の配布をする方を対象として,アップデートマニフェストへ電子署名を施して安全な自動更新を可能にする方法を解説いたしました。今回で全8回にわたる連載「Firefox 3ではじめる拡張機能開発」は終了となります。どうもありがとうございました。

著者プロフィール

Gomita

拡張機能開発者。
現在までにScrapBook,FoxAge2ch,Tab Scope,FireGesturesの4つをリリースしている。

URLhttp://www.xuldev.org/