火狐浏览器插件(FireFox Extension)签名指南
本签名指南由 WoSign 根据 Mozilla Developer Center 有关文档翻译整理,请同时参考原英文文档:
http://developer.mozilla.org/en/docs/Code_snippets:Signing_a_XPI
本指南使用 WoSign 代码签名证书 (多用途版) 数字签名 Mozilla 网站上的一个插件 (Adblock Plus) 为实例编写。
第1步:下载有关签名工具
从 Mozilla FTP 网站下载最新的网络安全服务包 (Network Security Services ,简称: NSS): http://ftp.mozilla.org/pub/mozilla.org/security/nss/releases/,对于 Windows 操作系统,NSS 包:nss-3.9.zip 的存放目录为:NSS_3_9_RTM/WINNT5.0_OPT.OBJ/,并解包到目录: c:\foxsign\nss-3.9\ ;
还需要下载最新的 Netscape Portable Runtime 包 ( 简称: NSPR) : http://ftp.mozilla.org/pub/mozilla.org/nspr/releases/ ,对于 Windows 操作系统,NSPR 包:nspr-4.6.zip 的存放目录为: v4.6/WINNT5.0_OPT.OBJ/,并解包到目录: c:\foxsign\ nspr-4.6\;
您还需要有压缩软件,推荐用 WinRAR ,并把 c:\foxsign\nss-3.9\bin\;c:\foxsign\nss-3.9\lib\; c:\foxsign\nspr-4.6\lib\;C:\Program Files\WinRAR 等目录添加系统路径上,以便 DOS 方式下能正常使用以上签名工具。
第2步:创建证书存储库文件
在 DOS 方式下输入以下命令,请不要漏了 -d 后面的“ . ”:
c:\foxsign> 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:
输入密钥管理密码后 ( 请记牢,以后签名时要用到 ) ,会在该目录下生成 3 个证书存储库文件: cert8.db 、 key3.db 和 secmod.db 。
第3步:导入PFX格式的代码签名证书到证书存储库
假设您已经成功申请 WoSign 代码签名证书 ( 多用途版 ) ,并已经得到 PFX 格式的证书文件;如果您得到的是双证书文件 (mykey.pvk 和 mycert.spc) ,请参考 证书格式转换指南 转换成 PFX 格式,假设为 mycs.pfx 文件。在 DOS 方式下输入以下命令,请不要漏了 -d 后面的“ . ”:
c:\foxsign> pk12util -i mycs.pfx -d .
Enter Password or Pin for "NSS Certificate DB":
Enter password for PKCS12 file:
pk12util: PKCS12 IMPORT SUCCESSFUL
先输入您在第 2 步设置的证书存储库管理密码,再输入您在导出 PFX 证书时设置的密码即可,会提示“ PKCS12 IMPORT SUCCESSFUL(PKCS12 格式证书导入成功 ) ” (PKCS12 格式就是 PFX 格式 )。
第4步:导入根证书和中级根证书,并检查证书是否正常导入
PFX 格式证书中本身已经含有证书颁发者的根证书和中级根证书,但由于 NSS 签名工具 Signtool 不支持证书链 (Mozilla 承认这是一个 Bug),所以您需要下载 WoSign 代码签名证书的 根证书 和 中级根证书 ,并保存工作目录下,如: c:\foxsign\rootCA.cer 和 c:\foxsign\subCA.cer 。并在 DOS 方式下输入以下命令,请不要漏了 -d 后面的“ . ”:
c:\foxsign> certutil -A -n " Root CA " -t "TC,TC,TC" -d . -i "rootCA.cer"
c:\foxsign> certutil -A -n " Sub CA " -t "c,c,C" -d . -i "subCA.cer"
并输入以下命令检查根证书和代码签名证书是否成功导入证书存储库中:
c:\foxsign> certutil -L -d .
22689013c 2abed23ee 6c 9a 95410b4_7dc62150 -9c 81-4ee5-8d03-1b 67c 2ba1fc2 u,u,u
WoSign Code Signing Authority - The USERTRUST Network C,C,C
UTN - USERFirst-Object CT ,C,C
如果显示以上信息,就表明证书导入成功,请注意第 1 行一直到“ u,u,u ”之前的一长串字符,这是系统自动分配的您的代码签名证书的证书别名 (alias) ,后面签名时会用到。
第5步:数字签名火狐插件XPI文件
本签名指南使用 Mozilla 网站上的一个插件 (Adblock Plus) ,原插件是没有签名的 ( 参见后面附图 ) ,在 c:\foxsign 目录下新建一个 signed 目录,再把 XPI 文件解包后的文件拷到此目录下,并在 DOS 方式下输入以下命令,请不要漏了 -d 后面的“ . ”,命令中的 alias 复制上一步看到的证书别名,如:22689013c 2abed23ee 6c 9a 95410b4_7dc62150 -9c 81-4ee5-8d03-1b 67c 2ba1fc2 ,而命令中的 password就是证书存储库管理密码:
c:\foxsign> signtool -d . -k alias -p password signed/
using certificate directory: .
Generating signed/META-INF/manifest.mf file..
--> chrome/adblockplus.jar
--> chrome.manifest
--> components/nsAdblockPlus.js
--> components/nsAdblockPlus.xpt
--> defaults/preferences/adblockplus.js
--> install.js
--> install.rdf
Generating zigbert.sf file.
tree "signed/" signed successfully
从最后一行可以看出:已经签名成功!会在 signed/ 目录下生成一个 META-INF 子目录,此目录中有 3 个文件: zigbert.rsa 、 manifest.mf 和 zigbert.sf ,请注意:文件 zigbert.rsa 含有签名信息,签名后不得修改和删除 signed/ 目录下的所有文件,否则会提示签名验证失败而无法安装 。
第6步:重新打包为XPI文件
把 signed/ 目录下的文件使用压缩工具打包成 zip 文件,推荐使用 WinRAR ,并使用 DOS 方式打包,因为 XPI 签名要求打包文件中的第一个文件是含有签名信息的 zigbert.rsa ,否则无法正常验证签名,而一般的压缩软件是按照字母顺序排列文件的。所以,必须先做一个指定压缩顺序的列表文件 list.txt ,如本例:
META-INF\zigbert.rsa
META-INF\manifest.mf
META-INF\zigbert.sf
chrome\adblockplus.jar
chrome.manifest
install.rdf
install.js
components\nsAdblockPlus.js
components\nsAdblockPlus.xpt
defaults\preferences\adblockplus.js
再在 DOS 方式下输入: c:\foxsign> winrar a test.zip @list.txt
再把 .zip 文件改名为 .xpi 文件即可: c:\foxsign> ren test.zip test.xpi
这样,才完成了 XPI 文件的签名,可以放到网上供用户下载安装了!
第7步:测试和演示已经签名的XPI插件
本指南的签名过程使用了 Mozilla 网站上的一个插件 (Adblock Plus) ,原插件是没有签名的,在火狐浏览器中点击运行时会显示“未签名”,如图 1 所示:
而使用 WoSign 代码签名证书签名后会显示软件发行者名称,如图 2 所示。点击“立即安装”后会提示安装成功,如图 3 所示:
您还可以使用火狐浏览器运行 Google 为火狐浏览器定制的 搜索工条插件 ,会显示软件发行者名称为: Google Inc.( http://dl.google.com/firefox/google-toolbar-win.xpi ) ,如图 4 所示:
本指南同样适用于Thawte代码签名证书和VeriSign代码签名证书。