How to sign XPI files

发布时间:2011-4-8 15:50
分类名称:Plugins


 

官方参考文章:https://developer.mozilla.org/en/Signing_a_XPI
Mozilla
建议使用NSS中提供的工具来签名XPI文件。NSSMozilla自己开发的一套安全库,此库和OpenSSL类似。

获取NSS

官方文档比较旧,其文中建议使用的NSS版本为nss 3.11.4 with nspr 4.6。但我下载后,导入pfx的证书时会崩溃(系统为Win7)。所以不建议使用此版本。我在它的服务器上找到了比较新的版本。而且不需要下载nsprnspr就是一些lib库,nss会使用它们),下载的nss内部已经自带。

下载地址:https://ftp.mozilla.org/pub/mozilla.org/security/nss/releases/NSS_3_12_4_RTM/msvc9/WINNT5.1_OPT.OBJ/nss-3.12.4.zip

下载的版本为 3.12.4,下面的介绍都是基于这个版本。
关于NSS工具(如certutil, signtool, pk12util等)使用说明,见Mozilla文档:
http://www.mozilla.org/projects/security/pki/nss/tools/

NSS 数据库操作

下载完,解压到c:\nss-3.12.4, 然后打开命令行,设置一下path变量:

set PATH=C:\nss-3.12.4\bin\;C:\nss-3.12.4\lib\;

在其它地方再创建一个目录,用来建立nss证书数据库,例如,这里使用:
C:\Projects\CodeSigning
目录,然后建立数据库:

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:

“.” 表示在当前目录建立数据库。然后会提示设置数据库密码。

官方文章中有一个示例教你如何建立测试用的自签名证书,由于这个操作在实际使用中并没有什么意义,就掠过了,具体操作见参考原文。

下面介绍如何使用已经存在的pfx证书来签名XPI

首先,也是最重要的,用来签名的XPI证书的用途必须是“code signing” 然后分俩个步骤走:
1.
安装CA根证书和中间CA证书(如果有的话)
2.
安装用来签名XPI文件的证书和其密钥。

示例中的证书链为:

Certum Root CA

          Certum Level III CA

                    Code Signing

首先,需要将RootIntermediate CA certificate 导入到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 III CA" -t "c,c,C" -d . -i "Certum Level III CA.cer"

 

;显示导入到数据库的结果

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

myTestCert                                                                                  u,u,Cu

Certum Root CA                                                                            CT,C,C

Certum Level III CA                                                               CT,C,C

然后导入签名证书,签名证书的名字为”TJ's Unizeto Sp. z o.o. ID”,可以为它在数据库中重新命名一个新的昵称,这个名字只是用来表示数据库对应的某个证书,并不会更改证书本来的内容。下面命名为“Code Signing (Certum)”

;导入XPI签名需要的证书(不带私钥)

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 III CA                                                               CT,C,C

Code Signing (Certum)                                                                       , ,

最后,导入密钥:

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 III CA                                                               c,c,C

Code Signing (Certum)                                                                     u,u,u

确认导入密钥后,确认此证书的属性为: u,u,u.
这样就可以用此证书来签名某个目录了。

Sign a directory

signtool -d . -k "Code Signing (Certum)" –p “password” test

using certificate directory: .

Generating test/META-INF/manifest.mf file..

--> test.txt

Generating zigbert.sf file..

tree "test" signed successfully

此命令将test目录下的全部文件进行签名。password 为一开始新建数据库时候的密码。” Code Signing (Certum)” 为对应签名证书的昵称

签名如果成功,最后会显示successfully,而且该目录下多了一个META-INF目录,里面有三个文件:

manifest.mf

zigbert.rsa

zigbert.sf

用压缩程序将其打包为zip包,更改扩展名为xpi

最后,需要将根证书,中间件证书都导入到firefox证书系统中,然后将xpi拖到Firefox,就会发现,未验证,变成了已验证。

Example

使用张晓龙提供的一个用途为签名软件的证书进行测试:

set PATH=E:\Projects\mozzilla\nss-3.12.4\bin\;E:\Projects\mozzilla\nss-3.12.4\lib\;%PATH%

certutil -A -n "Tianwei ca" -t "TC,TC,TC" -d . -i "tianwei_ca.cer"                ;导入根证书

certutil -A -n "tianwei code" -t "u,u,u" -d . -i "tianwei_code.cer"               ;导入签名证书

pk12util -i "tianwei_code.pfx" -d .                                                         ;导入密钥

 

E:\Projects\mozzilla\base>signtool -d . -k "tianwei code" -p password FtNpRuntimeCom

Generating FtNpRuntimeCom/META-INF/manifest.mf file..

--> FtNpRuntimeCom.xpi

--> install.rdf

--> plugins/npruntime.dll

Generating zigbert.sf file..

tree "FtNpRuntimeCom" signed successfully

End