Apr 09, 2007

オブジェクト署名済みパッケージの作り方まとめ

m.tamaki氏によるエントリとFirefox Hacksを見ながら自分でも試してみた。オブジェクト署名証明書が無いので、とりあえずオレオレ証明書での実験だけど。

準備

Windows XPで作業する場合の話をします。

必要なファイルは、NSS(Netscape Security Services)の中に含まれている署名用ツールと、それを動かすために必要なランタイム(Netscape Portable Runtime)。

nss-*.zipを展開するとbin, include, libの3つのフォルダが出てくる。このうち使うのはbinの中にあるツール群とlibの中にあるライブラリ。libの中にあるファイルをすべてbinに移動してしまおう。

nspr-*.zipを展開すると、同様にbin, include, libの3つが出てくるけど、こっちはbinとincludeは使わない。libの中にあるDLLファイルをNSSの方のbinに移動して、残りは全部削除。

インストールはこれでおしまい。NSSのbinをProgram Filesあたりに置いておこう。

以下、コマンドラインからの操作になるので、NSSのbinにパスを通しておくとよい。Windows XPの場合、マイコンピュータを右クリックして「プロパティ」でシステムのプロパティを開き、「詳細設定」の「環境変数」ボタンを押す。「システム環境変数」の中の「Path」を選択して「編集」ボタンを押し、末尾に「;C:\Program Files\nss\bin\」と書き加える(パスは自分がNSSを置いた場所に読み替えて下さい)。

オレオレ証明書の作成

適当なディレクトリで以下のコマンドを実行。

  1. mkdir certs
  2. cd certs
  3. certutil -N -d .

ここで何も表示されずにユーティリティが終了してしまった場合、NSSのlibかNSPRのlibの中身が認識されていない。NSSのbin、NSSのlib、NSPRのlibの中身が全部一ヶ所(NSSのbinフォルダ)にまとまっているかどうかチェックすること。

正常にユーティリティが動き出すと、パスワードの入力を求められる。何か適当なパスワードを入力(確認のための再入力有り)すると、certutilが終了して、certsディレクトリの中にcert8.db, key3.db, secmod.dbの3つのファイルが生成される。

そのまま続けて、以下のコマンドを入力する。

signtool -G "証明書の名前" -p "さっき入力したパスワード" -d .

証明書の名前は好きなように入力して構わない(例:「Clear Code Inc.」)。実行すると何やら警告のメッセージが表示されるので、「y」を入力してEnterすると、証明書の情報の入力を求められる。一応、以下にそれぞれの意味を書いておくけど、organization以外は空欄のまま進めても全然構わない(どうせ公開するものではないので)。

  1. certificate common name:許可証の名前。
  2. organization:組織・会社名。
  3. organization unit:部署名。
  4. state of province:地域。Tokyoとか。
  5. country (must be exactry 2 characters):国名。日本の場合は「jp」。
  6. username:ユーザ名。
  7. email address:メールアドレス。

すべて入力すると、何やらメッセージが出て、オレオレ証明書が生成される。cert8.dbとかがあるディレクトリに生成されるx509.cacertとx509.rawがそれなのかな?

オレオレ証明書で署名してみる

では、このオレオレ証明書でもって署名してみよう。まず署名付きのjarファイルの作り方。

  • myextension
    • chrome
      • content
      • locale
      • skin
    • defaults
      • preferences myextension.js
    • install.rdf
    • chrome.manifest

こんなフォルダ構成を想定して解説する。コマンドプロンプトで、myextensionがカレントディレクトリだとしよう。

  1. mkdir jar_temp
  2. xcopy chrome\content jar_temp\content /i /s
  3. xcopy chrome\locale jar_temp\locale /i /s
  4. xcopy chrome\locale jar_temp\skin /i /s
  5. signtool -k "証明書の名前" -p "さっき入力したパスワード" -d "さっき生成したcert8.dbほかがあるフォルダのパス" -Z myextension.jar jar_temp

これで、content, locale, skinを含んだ署名済みのjarファイルができる。次に、これを含んだXPIパッケージを作る。

  1. mkdir xpi_temp
  2. xcopy defaults xpi_temp\defaults /i /s
  3. xcopy *.rdf xpi_temp\ /i /s
  4. xcopy *.manifest xpi_temp\ /i /s
  5. mkdir xpi_temp\chrome
  6. xcopy *.jar xpi_temp\chrome\ /i /s
  7. signtool -k "証明書の名前" -p "さっき入力したパスワード" -d "さっき生成したcert8.dbほかがあるフォルダのパス" -X -Z myextension.xpi xpi_temp

signtoolのオプションで -X を加えるのを忘れないこと。これはXPIを生成する時用の指定。これがないと、署名付きで作ったはずのパッケージでも、署名無しと判定されてしまう。

ちゃんと署名されているかどうかを確認する

これでできあがったXPIパッケージをFirefoxのウィンドウにドラッグ&ドロップしてみる。「ソフトウェアインストール」ダイアログにおいて、普段だと「署名されていません」と赤文字で表示される所に、さっき入力した証明書の名前さっきorganizationの欄に入力した組織名が斜体で表示されていれば、このパッケージはちゃんと署名されている。

注意。本来だったら、Firefox内の証明書のデータベースにこのオレオレ証明書は登録されていないので、この時点で何らかの警告が出ないといけない(はず)。もし仮にこの問題が修正されたとしたら、オレオレ証明書で署名された拡張機能がちゃんと署名されているかどうかを確認するには、ユーザープロファイル内のcert8.db, key3.db, secmod.dbを、先ほど生成した物と入れ換えてやる必要がある。

オレオレ証明書じゃないちゃんとした証明書でのやり方は?

m.tamaki氏のエントリを参照してください。

気付いたこと

「ソフトウェアインストール」ダイアログで証明書の名前は見れるんだけど、それ以上の情報を確認できない……証明書の名前をクリックしても無反応だし。これじゃあ、どうやってオレオレ証明書とそうじゃない証明書を区別すればいいんだ?

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能