Signing a XPI

注: このページには、自己署名証明書によるテスト方法も書かれています。実践的な手順は 拡張機能への署名 をご覧ください。

この文書は オリジナル文書 の細かな整形を加えたミラーです。 (Wayback Machine アーカイブ)

この文書では、Firefox 拡張に Windows 上でコード署名をする方法を解説しています。MozDev グループの Pete Collins による linux での解説 So you want to sign your XPI package? を元にしています。

1. 最新の Network Security Services (NSS) パッケージを Mozilla FTP サイト ftp://ftp.mozilla.org/pub/mozilla.or.../nss/releases/ からダウンロードする。Windows 向けには、NSS_3_9_RTM/WINNT5.0_OPT.OBJ/ フォルダの nss-3.9.zip パッケージが利用できます。

2. アーカイブをローカルのフォルダーに解凍する。たとえば、C:\Apps\nss-3.9\ へ。

3. 最新の Netscape Portable Runtime パッケージ を Mozilla FTP サイト http://ftp.mozilla.org/pub/mozilla.org/nspr/releases/ からダウンロードする。Windows 向けには、v4.6/WINNT5.0_OPT.OBJ/ フォルダの nspr-4.6.zip パッケージです。

4. アーカイブをローカルのフォルダーに解凍する。たとえば、C:\Apps\nspr-4.6\ へ。

5. NSS ツールの bin/lib/、そして NSPR lib ディレクトリをシステムパスに追加します。この設定は、コントロールパネル -> システム -> 詳細設定 -> 環境変数 -> システム環境変数、の画面で、もしくは (バッチファイル用と思われる) コマンドラインツールを実行することで設定できます。Windows はシステムディレクトリに certutil.exe といった同じ名前のファイルを持ちますので、追加するディレクトリは PATH の先頭に加えることを忘れないでください。

C:\> set PATH=<b>C:\Apps\nss-3.9\bin\;C:\Apps\nss-3.9\lib\;C:\Apps\nspr-4.6\lib\;</b>%PATH%

6. NSS Tools の文書 を読んでください

7. 証明書データベースを初期化します。証明書データベースをどのディレクトリに作成するかを決めて、そのディレクトリで次のコマンドを実行してください。( 最後のドットを忘れないように)

C:\Projects\CodeSigning\> certutil -N -d .

最後の ドット はデータベースを 現在のディレクトリ に作成することを意味します。

NSS 証明書データベースのパスワード を聞かれますが、忘れないように!

C:\Projects\CodeSigning\> certutil -N -d .
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.

Enter new password:
Re-enter password:

8. テスト証明書を作成します。-p オプションで証明書のパスワードを設定できます。

C:\Projects\CodeSigning\> signtool -G myTestCert -d . -p"password"
using certificate directory: .

WARNING: Performing this operation while the browser is running could cause
corruption of your security databases. If the browser is currently running,
you should exit the browser before continuing this operation. Enter
"y" to continue, or anything else to abort: y


Enter certificate information.  All fields are optional. Acceptable
characters are numbers, letters, spaces, and apostrophes.
certificate common name: XPI Test
organization: TJworld
organization unit: Software
state or province: Nottingham
country (must be exactly 2 characters): GB
username: tj
email address: certificates@lan.tjworld.net
generated public/private key pair
certificate request generated
certificate has been signed
certificate "myTestCert" added to database
Exported certificate to x509.raw and x509.cacert.

x509.cacert は XPI パッケージに署名するために利用します。ファイルシステムと証明書データベースに存在するかを確認しましょう。

C:\Projects\CodeSigning\> dir x509*

14/12/2005  15:13             1,031 x509.cacert
14/12/2005  15:13               798 x509.raw

C:\Projects\CodeSigning\> certutil -d . -L
myTestCert                                                   u,u,Cu

8. 署名する XPI ファイルを準備する

署名するためのフォルダーを準備し、XPI をそこにコピーし、unzip* してください。そして、XPI を削除し、証明書データベースフォルダーに戻ります。

*zip ユーティリティーがシステムパスにあると想定しています。このサンプルでは、CygWin bin/zip.exe ツールを利用しています。内部のサブディレクトリ構造をきちんと取り扱えるグラフィカルな Zip ツールも利用可能です。ただし、7-Zip は正常に動作しません。これは、ディレクトリをアルファベット順に並べ替えるからで、Mozilla は最初のエントリが META-INF/zigbert.rsa であることを要求します。

C:\Projects\CodeSigning\> md signed

C:\Projects\CodeSigning\> copy C:\Projects\fsb\fsb.xpi signed
        1 file(s) copied.

C:\Projects\CodeSigning\> cd signed

C:\Projects\CodeSigning\signed> unzip fsb.xpi
Archive:  fsb.xpi
   creating: chrome/
  inflating: chrome.manifest
  inflating: chrome/fsb.jar
  inflating: install.rdf

C:\Projects\CodeSigning\signed> del fsb.xpi

C:\Projects\CodeSigning\signed> cd ..

9. XPI に署名する

C:\Projects\CodeSigning\> signtool -d . -k myTestCert -p "password" signed/
using certificate directory: .
Generating signed//META-INF/manifest.mf file..
--> chrome/fsb.jar
--> chrome.manifest
--> install.rdf
Generating zigbert.sf file..
tree "signed/" signed successfully

10. XPI を再パッケージする

signed/ フォルダーへ移動し、新しい zip アーカイブを META-INF/zigbert.rsa ファイルが先頭になるように作成し、他のファイルを追加します。

C:\Projects\Certs\> cd signed

C:\Projects\CodeSigning\signed\> zip fsb.xpi META-INF/zigbert.rsa
  adding: META-INF/zigbert.rsa (deflated 35%)

C:\Projects\CodeSigning\signed> zip -r -D fsb.xpi * -x META-INF/zigbert.rsa
  adding: META-INF/manifest.mf (deflated 37%)
  adding: META-INF/zigbert.sf (deflated 40%)
  adding: chrome/fsb.jar (deflated 74%)
  adding: chrome.manifest (deflated 69%)
  adding: install.rdf (deflated 62%)

11. あなたの Mozilla ブラウザにテスト証明書を一時的にインストールします

先に作った x509.cacert ファイルを x509.cert に変更します。

Mozilla Firefox にソフト開発証明書発行者としてインポートします。試験が終わったら、必ず Mozilla Firefox から証明書を削除してください

Firefox 1.5: From the Tools menu choose Options->Advanced->Security->View Certificates->Authorities

Firefox 1.0: From the Tools menu choose Options->Advanced->Certificates->Manage Certificates->Authorities

そして、インポート ボタンをクリックしてください。

x509.cert を含むフォルダーへ移動し、選択してください。

証明書のダウンロード ダイアログでは、ソフトウェア開発のためにこの認証局を承認する を選択し、必要があれば View ボタンでより詳細に証明書を確認してください。

OK ボタンをクリックすれば、あなたの新しい証明書が認証局リストにはいります。

12. 署名済み拡張をインストールする

署名済みの XPI をブラウザにドラッグ・ドロップするか、ダウンロードしてください。Mozilla Firefox ソフトウェアインストール ダイアログに、署名に利用した証明書の 組織名 が、通常 署名無し と表示されるところに表示されます。

画像

13. 有効なソフトウェア開発者の証明書を取得する

ここまでで全ての手順がうまく行くことが確認できましたので、NSS 証明書データベースに本物のソフトウェア開発者証明書を導入して、XPI の署名に利用します。キーとなる 3 つの違い - 可用性、値段、同一性確認 - のあるソフトウェア開発者向け証明書の発行者がいくつかあります。

ばかげたことに、ほとんどの発行者はソフトウェア開発者証明書を個人には発行していませんので、Mozilla Firefox に CA ルート証明書が組み込まれている発行者を発見するのは困難かもしれません。証明書発行者の CA ルート証明書が Mozilla Firefox になければ、拡張を導入しようとしているユーザにおいてあなたの証明書の有効性は検証されません。理想としてあなたが全ての主要なプラットフォーム (Microsoft Windows, Sun Java, Mozilla/Netscape Firefox/Navigator, Opera) にインストールされているルート CA を持つ証明書があれば、あなたのソフトウェアへの署名に一つの証明書だけで可能になり、プラットフォームは関係なくなります。

もっとも安価な、広くサポートされている (Mozilla, Java, Microsoft) 証明書は、Comodo Instant-SSL が提供していると思われます。オープンソース開発者向けに無料の証明書 が Unizeto Certum から提供されていますが、ルート証明書は Mozilla Firefox と Opera にしかありません。(Java や Microsoft にはありません。)

次にあげるものが現在利用可能と思われる発行者です

  • Comodo Instant-SSL Code Signing
  • Digi-Sign Digi-Code
  • GeoTrust Code Signing
  • Thawte Code Signing (owned by Verisign)
  • Unizeto Certum Code-signing (オープンソース開発者向けの無料証明書) * 2005/12/14 では Mozilla Firefox と Opera でのみ
  • Verisign Code Signing

コード署名証明書 に申し込みをし、発行者の発行対象確認手続きを経る必要があります。その後、書名付きの証明書が発行されます。書名付き証明書を受け取ったら、あなたの証明書データベースにインポートしなければなりません。

あなたのブラウザは新しい秘密鍵と CSR - コード署名要求 をバックグラウンドで生成しますが、あなたが気づくとは限りません。CSR は発行者に送信されます。後で、鍵と証明書をペアにする必要があるので、新しい証明書を同じブラウザにインストールする 必要があります<b> 。

<b>Hint: 証明書発行者に要請する際には、Organization (O) があなたの名前になっており、発行者の既定の文字列で無いことを確認してください。この文字列がユーザに表示されます。

このガイドでは、Unizeto Certum の無料証明書を利用しました。要請手順が終わったあと、自分についての詳細をオンラインで送信しました。そして、photo-ID かそれに似た形態の ID を文書証明として要求する自動メールを受け取りました。これに対して、自分のパスポートと運転免許証の高解像度のスキャン画像をこういった目的について持っていたので、自分のウェブサーバの非公開の場所において、Unizeto Certum に詳細とともに連絡しました。数時間の後、人間が読める ID の画像と証明書ダウンロードの URL が送られてきました。

Mozilla Firefox に証明書をインストールし (先に作成した秘密鍵と一緒に)、表示される 認証文字列 を新しいファイルにコピー・ペーストしてください。ファイル名は C:\Projects\CodeSigning\Certum Code Signing.cer です。

14. あなたの実際の証明書をインストールする

コード署名 NSS 証明書データベースに新しい証明書をインストールするには2段階の手順が必要です。

 1. 発行者の CA ルート証明書をインストールする
 2. あなたの鍵と証明書をインストールする

ルート CA はあなたの証明書の認証に必要です。多くの発行者は複数のルート CA をさまざまな認証レベルに対して持っています。あなたがダウンロードした証明書がそのうちのどれを利用しているか確認してください。証明書を Mozilla Firefox で表示することで詳細をみることができますので、発行者 CN から情報を得てください。(Unizeto Certum の無料証明書の場合は、Certum Level I です)

ルート CA とあなたの証明書に署名するのに発行者が利用した中間証明書をダウンロードします。発行者のウェブサイトにルート CA と公開証明書へのリンクがあるでしょう。(Certum の公開鍵ページ) Certum Root CACertum Level I Digital ID for WWW and SLS/TLS Servers をダウンロードし、その文字列を C:\Projects\CodeSigning\Certum Root CA.cerC:\Projects\CodeSigning\Certum Level I.cer に保存しました。

コード署名用フォルダーでコマンドプロンプトを開き (手順 5 での NSS ツールへのパスがちゃんと通っているかを確認してください)、正しく追加されているかを確認してください。

C:\Projects\CodeSigning> certutil -A -n "Certum Root CA" -t "TC,TC,TC" -d . -i "Certum Root CA.cer"

C:\Projects\CodeSigning> certutil -A -n "Certum Level I" -t "c,c,C" -d . -i "Certum Level I.cer"

C:\Projects\CodeSigning> certutil -L -d .
myTestCert                                                   u,u,Cu
Certum Root CA                                               CT,C,C
Certum Level I                                               CT,C,C

Mozilla Firefox の証明書ストアでの新しく発行された証明書の名前は覚えるのに簡単で無いエイリアスを示すので、ここで名前を変更するための追加の手順を示します。(残念なことに、変更手順は簡単なものではありません。)

名前をみるには、手順 II で述べた Mozilla Firefox の証明書マネージャーを表示し、あなたの証明書 を選びます。そして、新しい証明書を選択し、表示詳細 を選択し、証明書のフィールド のツリービューの先頭を見てください。

わたしの Unizeto Certum の証明書では "TJ's Unizeto Sp. z o.o. ID" となっていますが、"Code Signing (Certum)" としたいと思います。

このトリックは、証明書を鍵無しでインストールしニックネームを設定します。その後 Mozilla Firefox から鍵と証明書のペアをインポートしたとき、秘密鍵が証明書に追加されますが、名前はそのままになります。

C:\Projects\CodeSigning> certutil -A -n "Code Signing (Certum)" -t "u,u,u" -d . -i "Certum Code Signing.cer"

C:\Projects\CodeSigning> certutil -L -d .
myTestCert                                                   u,u,Cu
Certum Root CA                                               CT,C,C
Certum Level I                                               CT,C,C
Code Signing (Certum)                                        ,,

C:\Projects\CodeSigning> signtool -l -d .
using certificate directory: .

Object signing certificates
---------------------------------------
myTestCert
    Issued by: myTestCert (XPI Test)
    Expires: Tue Mar 14, 2006
Code Signing (Certum)
    Issued by: Certum Level I (Certum Level I)
    Expires: Tue Mar 14, 2006
---------------------------------------
For a list including CA's, use "signtool -L"

ここで、新しい鍵と証明書のペアを Mozilla Firefox の証明書データベースからエクスポートし、NSS 証明書データベースへ入れます。

もっとも困難な部分は、Mozilla の鍵データベースの場所です。key3.dbcert8.db の二つのファイルからなります。通常、Mozilla Firefox の ユーザプロファイルフォルダー にあり、わたしのところでは C:\Documents and Settings\TJ\Application Data\Mozilla\Firefox\Profiles\xxxxxxxx.default\ でした。(xxxxxxxx はランダム文字列)

この手順は、手順 13 で、新しい証明書を Mozilla Firefox にインストールしているものと仮定しています。

ファイルへエクスポート、コード署名データベースへインポート、そして署名属性 (u,u,u) を確認するコマンドが必要です。以下では証明書のニックネームと Mozilla Firefox の鍵データベースの場所にわたしのではなく自分のものを利用しなければならないことに気をつけてください。

C:\Projects\CodeSigning> pk12util -o "Certum Code Signing.pkcs12" -n "TJ's Unizeto Sp. z o.o. ID" -d "C:\Documents and Settings\TJ\Application Data\Mozilla\Firefox\Profiles\xxxxxxxx.default"
Enter password for PKCS12 file:
Re-enter password:
pk12util: PKCS12 EXPORT SUCCESSFUL

C:\Projects\CodeSigning> pk12util -i "Certum Code Signing.pkcs12" -d .
Enter Password or Pin for "NSS Certificate DB":
Enter password for PKCS12 file:
pk12util: PKCS12 IMPORT SUCCESSFUL

C:\Projects\CodeSigning> certutil -L -d .
myTestCert                                                   u,u,Cu
Certum Root CA                                               CT,C,C
Certum Level I                                               c,c,C
Code Signing (Certum)                                        u,u,u

既存の証明書がアップデートされたという通知を見るはずです。

15. あなたの実際の証明書に署名する

これは、手順 8, 9, 10 を実際の証明書で繰り返すときの詳細です。試験ディレクトリでの出力は以下のとおり

C:\Projects\CodeSigning>signtool -d . -k "Code Signing (Certum)" -p ******* test
using certificate directory: .
Generating test/META-INF/manifest.mf file..
--> test.txt
Generating zigbert.sf file..
tree "test" signed successfully

警告: 現在の NSS signtool では署名した証明書 (zigbert.rsa) には証明書チェーンを含みません。これは、Firefox は Certum Level I のような中間認証局で署名された証明書による署名されたコードのインストールを、先に中間証明書を Firefox にインストールしておかなければ拒否することを意味します。バグ 322603 にて NSS チームはコード署名に利用する証明書チェーンを利用する方法を探しています。さまざまな人が望むこの機能を NSS チームが実装できるように、何かコメントがありましたら投稿してください。

16. ビルドプロセスで署名を行う

これらの手順を拡張のビルドプロセス中で行おうと考えるでしょう。build.bat ファイルを jar や xpi ファイルを作成する手順の自動化に利用しています。このサンプルは CygWin の bin/zip.exe を必要とします。

build.bat は拡張のルートフォルダーに保存されます。たとえば

/dev/fsb/build.bat
/dev/fsb/install.rdf
/dev/fsb/chrome.manifest
/dev/fsb/chrome/
/dev/fsb/chrome/content/
/dev/fsb/chrome/locale/
/dev/fsb/chrome/skin/

コード署名の手順 (バッチファイル) は以下のとおりです

@echo off
set x=%cd%
echo Building %x%.xpi ...
echo Started at %DATE% %TIME% > %x%\build.log
md build\chrome
cd chrome
zip  -r -0 "%x%.jar" * >> %x%\build.log
move "%x%.jar" ..\build\chrome >> %x%\build.log
cd ..
copy install.rdf build >> %x%\build.log
copy chrome.manifest build >>%x%\build.log
signtool.exe -d C:\Projects\CodeSigning -k "Code Signing (Certum)" -p "password" build/ >> %x%\build.log
cd build
zip "%x%.xpi" META-INF/zigbert.rsa >> %x%\build.log
zip -r -D "%x%.xpi" * -x META-INF/zigbert.rsa >> %x%\build.log
rem copy "%x%.xpi" ..\..\..\http\fsb.xpi >> %x%\build.log
move "%x%.xpi" ..\ >> %x%\build.log
cd ..
rd build /s/q
echo Done.

<b>password</b> をあなたの NSS 証明書データベースのパスワードに変更するのを忘れないでください。

Document Tags and Contributors

Contributors to this page: Kohei, Shimono, ethertank, Mgjbot
最終更新者: ethertank,