WindowsでFirefox?のXPIに署名する方法についてまとめ。

署名の手順

証明書を入手する

証明書ストアに証明書を登録

  • Firefoxを開き、ツール→オプション→セキュリティ→証明書を表示→インポートとしてPKCS#12相当(pfxやp12など)のファイルのパスとパスワードを指定。
  • 登録された証明書をダブルクリックして詳細を選び、証明書の階層で証明書を選択。証明書のフィールドのルートにある名前が証明書の名前となる。

signtoolの用意

署名

signtool -d "c:\Documents and Settings\(ユーザー名)\Application Data\Mozilla\Firefox\Profiles\(ランダムな文字列).(プロファイル名)" -k "証明書の名前" -p "証明書のパスワード" -X -Z "作成するXPIファイル名" "XPIのソースフォルダ"

署名成功のステータスメッセージが出て、xpiができてたら成功。うまくいったかどうかはFirefoxにxpiをドラッグして署名がついていることを確認すればわかる。

参考となるサイト

その他の情報

PKCS#7であるAuthenticode対応Digital IDをPKCS#12のpfxに変換

  • 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という名前の証明書ができる。