WindowsでFirefox?のXPIに署名する方法についてまとめ。
署名の手順
証明書を入手する
- コードサイニング証明書 - Object Signing対応Digital IDやSSL Digital Certificate Technical Support - thawteなどから証明書を入手する。
証明書ストアに証明書を登録
- Firefoxを開き、ツール→オプション→セキュリティ→証明書を表示→インポートとしてPKCS#12相当(pfxやp12など)のファイルのパスとパスワードを指定。
- 登録された証明書をダブルクリックして詳細を選び、証明書の階層で証明書を選択。証明書のフィールドのルートにある名前が証明書の名前となる。
signtoolの用意
- NSSを以下から用意
- NSPRを以下から用意
- http://ftp.mozilla.org/pub/mozilla.org/nspr/releases/ 内のwindows用バイナリのある最新のバージョン
- '07/10時点での直リン: http://ftp.mozilla.org/pub/mozilla.org/nspr/releases/v4.6.4/msvc6.0/WINNT5.0_OPT.OBJ/nspr-4.6.4.zip
- それぞれ解凍し、NSPRのlibの内容とNSSのlibの内容を全てNSSのbinにコピー。
- (Firefox2のフォルダのnspr4.dllなども必要かもしれません。)
署名
signtool -d "c:\Documents and Settings\(ユーザー名)\Application Data\Mozilla\Firefox\Profiles\(ランダムな文字列).(プロファイル名)" -k "証明書の名前" -p "証明書のパスワード" -X -Z "作成するXPIファイル名" "XPIのソースフォルダ"
署名成功のステータスメッセージが出て、xpiができてたら成功。うまくいったかどうかはFirefoxにxpiをドラッグして署名がついていることを確認すればわかる。
参考となるサイト
- 公式。ただ、相当古いし、なんかInternetArchiveから掘り出したものを修正したもの?
- 韓国語の署名解説サイト:
- 後はFireFox Hacksを参考にしました。
- ちなみに大御所Piroさんのサイトの記事
- こちらのサイトでもまとまってます。
- signtoolのライブラリ、Network Security Survicesの解説
- 証明書のファイルフォーマットについてはen.wikipediaのPCKSの項目が参考になります。
その他の情報
PKCS#7であるAuthenticode対応Digital IDをPKCS#12のpfxに変換
- もし手元にあるのがコードサイニング証明書 - Authenticode対応Digital IDだった場合、PKCS#7フォーマットのsample.spc, sample.pvkとなる。これらをPKCS#12であるpfxに変換することでFirefoxのxpiに署名を行うことは技術的には可能。
- Download details: Office 2000 Tool: PVK Digital Certificate Files ImporterからpvkimprtをDL&インスト
- 以下のコマンドを実行
pvkimprt -PFX sample.spc sample.pvk
- ダイアログが開くので証明書のパスワードを入力>証明書のエクスポートウィザードが表示される
- 秘密キーのエクスポートで「はい」
- エクスポートファイルの形式に進む
- PKCS #12になっていることを確認
- 「証明のパスにある証明書を可能であればすべて含む」にチェック
- 「強力な保護を有効にする」にチェック
- エクスポート先を指定してOkするとpfxが生成される。
証明書ストア
- cert8.db, key3.db, secmod.dbという3つのファイルがあるフォルダのこと。Firefoxのプロファイルディレクトリにある。
- NSSの中にあるcertutilを使って
certutil -N -d "作成先ディレクトリパス"
- として作ることもできる。この際作成先ディレクトリパスはすでに存在する必要がある。また作成時にパスワードを入力するが、証明書ストアのパスワードなので証明書と同じパスワードでなくともよい。
他の環境で署名しようとした時に、signtool: PROBLEM signing data (Unknown issuer) というエラーがでたとき
- 以下のようにすることでBuiltin Object Tokenをちゃんと解決できるかもしれない。未検証。
modutil -add "Builtin Roots Module" -libfile "path\to\nssckbi.dll" -dbdir "path\to\cert_db"
> signtool -d "cert_store_dir" -k "cert_name" -p "passwd" -X -Z "xpi_path" "xpi_src_dir" using certificate directory: "cert_store_dir" Generating "xpi_src_dir"/META-INF/manifest.mf file.. --> chrome/"xpi_name".jar --> chrome.manifest --> install.rdf Generating zigbert.sf file.. signtool: PROBLEM signing data (Unknown issuer) the tree "xpi_src_dir" was NOT SUCCESSFULLY SIGNED
- これの原因はBuiltin Object Tokenと呼ばれる証明書群が見つからなかったために起こることが多い。
- 元の環境で
> signtool -d "cert_store_dir" -L using certificate directory: "cert_store_dir" S Certificates - ------------ * 00000000-0000-0000-0000-000000000000 Thawte Code Signing CA - Thawte Consulting cc VeriSign, Inc. - VeriSign, Inc. VeriSign, Inc. - VeriSign, Inc. #2 Builtin Object Token:Verisign/RSA Secure Server CA Builtin Object Token:GTE CyberTrust Root CA Builtin Object Token:GTE CyberTrust Global Root Builtin Object Token:Thawte Personal Basic CA Builtin Object Token:Thawte Personal Premium CA Builtin Object Token:Thawte Personal Freemail CA :
- となるのに、署名したい環境で
> signtool -d "cert_store_dir" -L using certificate directory: "cert_store_dir" S Certificates - ------------ * 00000000-0000-0000-0000-000000000000 Thawte Code Signing CA - Thawte Consulting cc VeriSign, Inc. - VeriSign, Inc. VeriSign, Inc. - VeriSign, Inc. #2
- となり、Builtin Object Tokenが表示されない。
- これは、secmod.dbが参照しているnssckbi.dllが見つからないため。nssckbi.dllの中にはBuiltin Object Tokenが格納されている。
- 特にFirefoxのプロファイルフォルダから証明書ストアをコピーした場合、nssckbi.dllのパスが、C:\Program Files\Mozilla Firefox\nssckbi.dllといった形のフルパスでハードコードされてしまっている。
- 新しい環境にFirefoxが入っていなかったり、OSがVistaでXPとはFirefoxのインストールパスが異なった場合、nssckbi.dllが見つからず、Builtin Object Tokenが見つからず、Unknown issuerというエラーに繋がる。
- 解決するには、secmod.dbに書かれているパスにnssckbi.dllを置くか、Stirling(Windows95/98/Me / ユーティリティ)などのバイナリエディタでnssckbi.dllのディレクトリパス部分を削除して、nssckbi.dllをsecmod.dbと同じフォルダに置く。
- Ref: [vine-users:073843] Re: 解決(Re: firefox のルート証明書がみつからない)
コマンドラインでの証明書ストアへの証明書の登録
pk12util -i "pfxファイルのパス" -d "証明書ストアのパス"
- ただ、この方法で登録した証明書を使用したとき、signtoolで署名するときに秘密鍵がないというエラーになることがあった。
コマンドラインで証明書ストア内の証明書の名前を知る
certutil -L -d .
- とする。と、
{455DD8FC-CEAE-497D-8D8C-22CBACA298A0} u,u,u - のような表示が出る。この場合{455DD8FC-CEAE-497D-8D8C-22CBACA298A0}が登録された証明書の名前。
IEでの証明書の変換
- 証明書の名前がPvkTmp:e962b86a-6fa0-4072-a46a-9fd9d4a04ca6のように、!PvkTmp:が先頭についているときは正しく署名ができないことがある。
- この場合はIEを使って証明書を変換するとうまくいくことがあった。
- インターネットオプション→コンテンツ→証明書→インポート→sample.pfxを選択→秘密キーを入力→このキーをエクスポート可能にするをチェックして次へ→証明書ストアはそのままで次へ→完了
- としてまず証明書をIEに登録し、そのまま追加された証明書を選択、
- エクスポート→はい、秘密キーをエクスポートします→Personal Infomation Exchange - PKCS #12 (.PFX) になっていることを確認して次へ→秘密キーを入力→エクスポート先を選択。
- こうしてできた証明書を証明書ストアに登録してつかう。
コマンドラインでの証明書の変換
- あらかじめ変換前の証明書を証明書ストアに登録しておく。
signtool -G "変換後の証明書の名前" -k "返還前の証明書の名前" -p "証明書のパスワード" -d "証明書ストアのパス"
- 実行すると以下のようなメッセージが出るので適当に入力。
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: converted_cert_name organization: sample inc. organization unit: sample dev. state or province: Tokyo country (must be exactly 2 characters): jp username: sample email address: sample@sample.jp generated public/private key pair certificate request generated certificate has been signed certificate "converted_cert_name" added to database Exported certificate to x509.raw and x509.cacert.
- 成功するとconverted_cert_nameという名前の証明書ができる。